SQL聚合函数功能和用法解析

SQL聚合函数功能和用法解析第一部分:介绍SUM和AVG  我们知道数据库通常包含大量数据,要从海量的数据中找到我们需要的某条记录无异于大海捞针,不过通过SQL语言我们可以找到很多方法从数据库中提取我们要查找的特定数据,就是通过这些方法我们才能找到“列举出七八两个月中购买了西伯利亚羊毛的所有顾客的姓名”这类问题的答案。  很多时候,我们还希望能够通过对数据进行分析,总结出规律和趋势或生成高水平的报表。例如,对于采购经理来说,…

大家好,又见面了,我是你们的朋友全栈君。第一部分:介绍SUM和
AV
G

  我们知道数据库通常包含大量数据,要从海量的数据中找到我们需要的某条记录无异于大海捞针,不过通过SQL语言我们可以找到很多方法从数据库中提取我们要查找的特定数据,就是通过这些方法我们才能找到“列举出七八两个月中购买了西伯利亚羊毛的所有顾客的姓名”这类问题的答案。

  很多时候,我们还希望能够通过对数据进行分析,总结出规律和趋势或生成高水平的报表。例如,对于采购经理来说,他可能对所有销售出去的产品清单不感兴趣,而只是想要知道这个月产品的销售量。SQL提供了聚合函数(aggregate functions)功能来支持对大量数据进行总结的操作。本文我们将具体来看看这些函数的功能和用法,包括添加数据和计算平均值的函数、对符合特定标准的记录进行计数的函数,以及找出表中最大值和最小值的函数。

  我们将使用下文所示的ProductOrder表来执行我们所有的查询。注意,这个表并没有标准化,而是将几个数据实体联合到一个表中,这样做是为了简化条件方便说明。如果要设计较好的关系数据库,应当把这些内容至少分成三个关联表Products、Orders和Customers。

订单号

 

 

客户名

 

客户姓

 

数量

 

单价

 

所在地

 

122

 

John

 

Jacob

 

21

 

4.52

 

北美洲

 

923

 

Ralph

 

Wiggum

 

192

 

3.99

 

北美洲

 

238

 

Ryan

 

Johnson

 

87

 

4.49

 

非洲

 

829

 

Mary

 

Smith

 

842

 

2.99

 

北美洲

 

824

 

Elizabeth

 

Marks

 

48

 

3.48

 

非洲

 

753

 

James

 

Linea

 

9

 

7.85

 

北美洲

 

942

 

Alan

 

Jonas

 

638

 

3.29

 

欧洲

 

        我们先从SUM函数开始。这个函数通常在SELECT语句中使用,返回系列值的总数。假设产品项目经理想了解目前为止商品的总销售额,那么我们可以使用以下的查询脚本:

SELECT SUM(数量) AS 总数 
  FROM ProductOrders 
  执行语句将返回以下结果: 
  Total 
  ———– 
  1837
  AVG函数(平均函数)使用方法和SUM类似,它给我们提供系列值的算术平均数。这次我们可以尝试稍微复杂点的任务:找出北美洲大陆所有订单的金额平均值。注意,我们需要将“数量”列和“单价”列相乘计算出每张订单的金额总数。查询脚本如下:
SELECT AVG(单价* 数量) As 平均金额 
FROM ProductOrders 
WHERE 所在地 = “北美洲”
    返回结果如下:
平均金额 
——————— 
862.3075

 

在本文第二部分,我们将探讨计算满足设定标准的记录数量的方法。

  第二部分:COUNT计数函数

  SQL提供了COUNT函数来查询满足设定标准的记录的数量。我们可以使用单独COUNT(*)语法来检索一个表内的行数。此外,还可以利用WHERE子句来设置计数条件,返回特定记录的条数。例如,假设我们的产品销售经理想了解公司处理了多少张要求购买100个以上产品的订单。下面是满足这个条件的SQL查询脚本:

SELECT COUNT(*) AS ‘大订单数量’
FROM ProductOrders
WHERE 数量> 100
    返回结果如下: 
大订单数量 
———————- 
3

  COUNT函数还允许使用 DISTINCT关键字和表达式来计算满足表达式的值在目标数据中出现的数量。同样地,还可以使用ALL关键字来返回满足表达式的值的全部数量,不管其中有没有重复值。例如,产品经理想通过一个简单查询返回数据库中“所在地”的数量。

  首先我们来看看使用ALL关键字的查询:

SELECT COUNT(ALL 所在地 ) As ‘ 所在地数量 
FROM ProductOrders

 

 

    返回的结果为:

 

 

所在地数量  
——————– 
7

 

 

  显然这不是我们需要的结果。因为根据ProductOrders表所示,所有订单的所在地只有三个,分别是北美洲、非洲、欧洲。下面让我们来用DISTINCT关键字来代替看看: 
  

SELECT COUNT(DISTINCT 所在地) As ‘所在地数量’
FROM ProductOrders 
    返回的结果为:
所在地数量
——————– 
3

  这才是我们想要的结果。

  在本文的第三部分,我们将介绍如何利用函数来查找目标集中的最大值和最小值。

  第三部分:最大值和最小值

  在本文的最后一节,我们来看看SQL为我们提供用来查找满足给定表达式的最大值和最小值的函数。MAX()函数返回给定数据集中的最大值。我们可以给该函数一个字段名称来返回表中给定字段的最大值。还可以在MAX()函数中使用表达式和GROUP BY从句来加强查找功能。

  还是ProductOrders表,假设我们的产品经理想要从这个数据库中找到给公司带来最多收入的那份订单。我们可以使用以下查询来找到这张订单,并返回该订单的销售总金额:

SELECT MAX(数量 * 单价)As ‘最大的订单’ 
  FROM ProductOrders 
  返回结果如下: 
  最大的订单 
  ——————— 
  2517.58

  MIN()函数的用法类似,但返回表达式的最小值。让我们用MIN()函数来尝试稍微复杂一点的查询。我们的销售部门目前正在分析小订单的数据。他们想要查询每个所在地的最小订单。这除了要在表达式中计算值外,还需要用到GROUP BY从句来总结所在地的数据。SQL查询如下:

SELECT 
所在地 
, MIN( 
数量 

单价 
) AS ‘ 
最小订单 

FROM ProductOrders 
GROUP BY 

所在地

 

 

    
返回结果如下:

 

 

所在地 
     
最小订单 

————- ——————— 

非洲 
        167.04

欧洲 
       2099.02

北美洲 
   70.65

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151845.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 软件测试工程师经典面试题[通俗易懂]

    软件测试工程师经典面试题[通俗易懂]  软件测试工程师,和开发工程师相比起来,虽然前期可能不会太深,但是涉及的面还是比较广的。前期面试实习生或者一年左右的岗位,问的也主要是一些基础性的问题比较多。涉及的知识主要有MySQL数据库的使用、Linux操作系统的使用、软件测试框架性的问题,测试环境搭建问题、当然还有一些自动化测试和性能测试的问题。测试工程师的面试题,基本上都是大同小异的,面试的核心主要在于框架模块(一到两年工作经验)。今…

  • word——VBA编程「建议收藏」

    word——VBA编程「建议收藏」最近需要批量操作一些word文件,大约四十几个文件把。一个一个手动操作真的太low了,所以研究了一下word的宏,VBA编写代码,批量操作。Sub批量操作WORD()DimpathAsStringDimFileNameAsStringDimworddocAsDocumentDimMyDirAsStringMyDir=”…

  • java 生成中文字符乱码,java汉字乱码的原因与解决方法

    java 生成中文字符乱码,java汉字乱码的原因与解决方法在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出现此问题。1、在网页中输出中文。JAVA在网络传输中使用的编码是”ISO-8859-1″,故在输出时需要进行转化,如:Stringstr=”中文”;str=newString(str.get…

  • python进阶(15)多线程与多进程效率测试「建议收藏」

    python进阶(15)多线程与多进程效率测试「建议收藏」前言在Python中,计算密集型任务适用于多进程,IO密集型任务适用于多线程正常来讲,多线程要比多进程效率更高,因为进程间的切换需要的资源和开销更大,而线程相对更小,但是我们使用的Python大多

  • 各种浏览器怎么换ip

    各种浏览器怎么换ip

    2021年10月23日
  • Linux 设置oracle1521端口[通俗易懂]

    Linux 设置oracle1521端口[通俗易懂]centos5安装oracle实现其他机器连接,oracleserver与其他机器可以ping通,但由于linux防火墙默认是不开启1521端口的,应此需设置iptables;开始用命令设置:iptables-AINPUT-ptcp–dport1521-jACCEPTiptables-AOUTPUT-ptcp–sport1521-jACCEPT

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号