8.2 聚合函数的应用
聚合函数在数据库数据的查询分析中,应用十分广泛。本节将分别对各聚合函数的应用进行说明。
8.2.1 求和函数——SUM()
求和函数SUM( )用于对数据求和,返回选取结果集中所有值的总和。语法如下。
SELECT SUM(column_name)
FROM table_name
说明:SUM()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
实例1 SUM函数的使用
从TEACHER表中查询所有男教师的工资总数。TEACHER表的结构和数据可参见5.2.1节的表5-1,下同。实例代码:
SELECT SUM(SAL) AS BOYSAL
FROM TEACHER
WHERE TSEX='男'
运行结果如图8.1所示。
图8.1 TEACHER表中所有男教师的工资总数
实例2 SUM函数对NULL值的处理
从TEACHER表中查询年龄大于40岁的教师的工资总数。实例代码:
SELECT SUM(SAL) AS OLDSAL
FROM TEACHER
WHERE AGE>=40
运行结果如图8.2所示。
图8.2 TEACHER表中所有年龄大于40岁的教师的工资总数
当对某列数据进行求和时,如果该列存在NULL值,则SUM函数会忽略该值。
8.2.2 计数函数——COUNT()
COUNT()函数用来计算表中记录的个数或者列中值的个数,计算内容由SELECT语句指定。使用COUNT函数时,必须指定一个列的名称或者使用星号,星号表示计算一个表中的所有记录。两种使用形式如下。
* COUNT(*),计算表中行的总数,即使表中行的数据为NULL,也被计入在内。
* COUNT(column),计算column列包含的行的数目,如果该列中某行数据为NULL,则该行不计入统计总数。
1.使用COUNT(*)函数对表中的行数计数
COUNT(*)函数将返回满足SELECT语句的WHERE子句中的搜索条件的函数。
实例3 COUNT(*)函数的使用
查询TEACHER表中的所有记录的行数。实例代码:
SELECT COUNT(*) AS TOTALITEM
FROM TEACHER
运行结果如图8.3所示。
图8.3 使用COUNT(*)函数对表中的行数计数
在该例中,SELECT语句中没有WHERE子句,那么认为表中的所有行都满足SELECT语句,所以SELECT语句将返回表中所有行的计数,结果与5.2.1节的表5-1列出的TEACHER表的数据相吻合。
如果DBMS在其系统表中存储了表的行数,COUNT(*)将很快地返回表的行数,因为这时,DBMS不必从头到尾读取表,并对物理表中的行计数,而直接从系统表中提取行的计数。而如果DBMS没有在系统表存储表的行数,将具有NOT NULL约束的列作为参数,使用COUNT( )函数,则可能更快地对表行计数。
注意
COUNT(*)函数将准确地返回表中的总行数,而仅当COUNT()函数的参数列没有NULL值时,才返回表中正确的行计数,所以仅当受NOT NULL限制的列作为参数时,才可使用COUNT( )函数代替COUNT(*)函数。
2.使用COUNT( )函数对一列中的数据计数
COUNT( )函数可用于对一列中的数据值计数。与忽略了所有列的COUNT(*)函数不同,COUNT( )函数逐一检查一列(或多列)中的值,并对那些值不是NULL的行计数。
实例4 查询多列中所有记录的行数
查询TEACHER表中的TNO列、TNAME列以及SAL列中包含的所有数据行数。实例代码:
SELECT COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME,
COUNT(SAL) AS TOTAL_SAL
FROM TEACHER
运行结果如图8.4所示。
图8.4 使用COUNT( )函数对一列中的数据计数
可见,TNO列与TNAME列由于其中不含有NULL值,所以其计数与使用COUNT(*)函数对TEACHER表中的记录计数结果相一致,而 SAL列由于其中有两行数据为NULL,所以这两列没有被计入在内,计数结果也就是8。
3.使用COUNT( )函数对多列中的数据计数
COUNT( )函数不仅可用于对一列中的数据值计数,也可以对多列中的数据值计数。如果对多列计数,则需要将要计数的多列通过连接符连接后,作为COUNT( )函数的参数。下面将结合具体的多列计数的实例,说明其使用过程。
*说明
关于如何使用连接符连接多列可参见本书的7.2节。
实例5 使用COUNT( )函数对多列中的数据计数
统计TEACHER表中的TNO列、TNAME列和SAL列中分别包含的数据行数,以及TNO列和TNAME列、TNAME列和SAL列一起包含的数据行数。实例代码:
SELECT COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME,
COUNT(SAL) AS TOTAL_SAL,
COUNT(CAST(TNO AS VARCHAR(5)) + TNAME) AS T_NONAME,
COUNT(TNAME + CAST(SAL AS VARCHAR(5))) AS T_NAMESAL
FROM TEACHER
运行结果如图8.5所示。
图8.5 使用COUNT( )函数对多列中的数据计数
在进行两列的连接时,由于它们的数据类型不一致,因此要使用CAST表达式将它们转换成相同的数据类型。
在7.2.1节已经讲过,如果在被连接的列中的任何一列有NULL值时,那么连接的结果为NULL,则该列不会被COUNT( )函数计数。
注意
COUNT( )函数只对那些传递到函数中的参数不是NULL的行计数。
4.使用COUNT函数对满足某种条件的记录计数
也可以在SELECT语句中添加一些子句约束来指定返回记录的个数。
实例6 使用COUNT函数对满足某种条件的记录计数
查询TEACHER表中女教师记录的数目。实例代码:
SELECT COUNT(*) AS TOTALWOMEN
FROM TEACHER
WHERE TSEX='女'
运行结果如图8.6所示。
图8.6 使用COUNT函数对满足某种条件的记录计数
这时结果为6而不是前面的所有记录10。之所以可以通过WHERE子句定义COUNT()函数的计数条件,这与SELECT语句各个子句的执行顺序是分不开的。前面已经讲过,DBMS首先执行FROM子句,而后是WHERE子句,最后是SELECT子句。所以COUNT()函数只能用于满足 WHERE子句定义的查询条件的记录。没有包括在WHERE子句的查询结果中的记录,都不符合COUNT()函数。
8.2.3 最大/最小值函数—MAX()/MIN()
当需要了解一列中的最大值时,可以使用MAX()函数;同样,当需要了解一列中的最小值时,可以使用MIN()函数。语法如下。
SELECT MAX (column_name) / MIN (column_name)
FROM table_name
说明:列column_name中的数据可以是数值、字符串或是日期时间数据类型。MAX()/MIN()函数将返回与被传递的列同一数据类型的单一值。
实例7 MAX()函数的使用
查询TEACHER表中教师的最大年龄。实例代码:
SELECT MAX (AGE) AS MAXAGE
FROM TEACHER
运行结果如图8.7所示。
图8.7 TEACHER表中教师的最大年龄
然而,在实际应用中得到这个结果并不是特别有用,因为经常想要获得的信息是具有最大年龄的教师的教工号、姓名、性别等信息。
然而SQL不支持如下的SELECT语句。
SELECT TNAME, DNAME, TSEX, MAX (AGE)
FROM TEACHER
因为聚合函数处理的是数据组,在本例中,MAX函数将整个TEACHER表看成一组,而TNAME、DNAME和TSEX的数据都没有进行任何分组,因此SELECT语句没有逻辑意义。同样的道理,下面的代码也是无效的。
SELECT TNAME, DNAME, TSEX,SAL ,AGE
FROM TEACHER
WHERE AGE=MAX (AGE)
解决这个问题的方法,就是在WHERE子句中使用子查询来返回最大值,然后再基于这个返回的最大值,查询相关信息。
实例8 在WHERE子句中使用子查询返回最大值
查询TEACHER表中年纪最大的教师的教工号、姓名、性别等信息。
实例代码:
SELECT TNAME, DNAME, TSEX, SAL, AGE
FROM TEACHER
WHERE AGE=(SELECT MAX (AGE) FROM TEACHER)
运行结果如图8.8所示。
图8.8 在WHERE子句中使用子查询返回最大值
MAX()和MIN()函数不仅可以作用于数值型数据,也可以作用于字符串或是日期时间数据类型的数据。
实例9 MAX()函数用于字符型数据
如下面代码:
SELECT MAX (TNAME) AS MAXNAME
FROM TEACHER
运行结果如图8.9所示。
图8.9 在字符串数据类型中使用MAX的结果
可见,对于字符串也可以求其最大值。
*说明
对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。
当然,对与日期时间类型的数据也可以求其最大/最小值,其大小排列就是日期时间的早晚,越早认为其值越小,如下面的实例。
实例10 MAX()、MIN()函数用于时间型数据
从COURSE表中查询最早和最晚考试课程的考试时间。其中COURSE表的结构和数据可参见本书6.1节的表6-1。实例代码:
SELECT MIN (CTEST) AS EARLY_DATE,
MAX (CTEST) AS LATE_DATE
FROM COURSE
运行结果如图8.10所示。
图8.10 COURSE表中最早和最晚考试课程的考试时间
可见,返回结果的数据类型与该列定义的数据类型相同。
注意
确定列中的最大值(最小值)时,MAX( )(MIN( ))函数忽略NULL值。但是,如果在该列中,所有行的值都是NULL,则MAX( )/MIN( )函数将返回NULL值。
8.2.4 均值函数——AVG()
函数AVG()用于计算一列中数据值的平均值。语法如下。
SELECT AVG (column_name)
FROM table_name
说明:AVG()函数的执行过程实际上是将一列中的值加起来,再将其和除以非NULL值的数目。所以,与SUM( )函数一样,AVG()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
实例11 AVG()函数的应用
从TEACHER表中查询所有教师的平均年龄。实例代码:
SELECT AVG (AGE) AS AVG_AGE
FROM TEACHER
运行结果如图8.11所示。
图8.11 TEACHER表中所有教师的平均年龄
在计算平均值时,AVG()函数将忽略NULL值。因此,如果要计算平均值的列中有NULL值,计算均值时,要特别注意。
实例12 AVG()函数对NULL值的处理
从TEACHER表中查询所有教师的平均工资。实例代码:
SELECT AVG (SAL) AS AVG_AGE1,SUM(SAL)/COUNT(*) AS AVG_AGE2,
SUM(SAL)/COUNT(SAL) AS AVG_AGE3
FROM TEACHER
运行结果如图8.12所示。
图8.12 TEACHER表中所有教师的平均工资
可以发现得到了不同的结果。实际上,“AVG (SAL)”与“SUM(SAL)/COUNT(SAL)”语句是等价的。因为AVG(SAL)语句的执行过程实际上是将SAL列中的值加起来,再将其和(也就等价于SUM(SAL))除以非NULL值的数目(也就等价于COUNT(SAL))。而语句“SUM(SAL)/COUNT(*)”则不然,因为 COUNT(*)返回的是表中所有记录的个数,而不管SAL列中的数值是否为NULL。
注意
AVG()函数在计算一列的平均值时,忽略NULL值。但是,如果在该列中,所有行的值都是NULL,则AVG()函数将返回NULL值。
如果不想对列中的所有值求平均,则可在WHERE子句中使用搜索条件来限制用于计算均值的行。
实例13 在WHERE子句中使用搜索条件来限制用于计算均值的行
从TEACHER表中查询所有计算机系教师的平均年龄。实例代码:
SELECT AVG (AGE) AS AVGCOMPUTER_AGE
FROM TEACHER
WHERE DNAME = '计算机'
运行结果如图8.13所示。
图8.13 TEACHER表中所有计算机系教师的平均年龄
当执行SELECT语句时,DBMS将表中的每行对WHERE子句中的搜索条件“DNAME = '计算机'”求值。只有那些搜索条件为True时,行中的AGE值才传到均值函数AVG (AGE)中。
当然,除了显示表中某列的平均值,还可用AVG()函数作为WHERE子句的一部分。与前面介绍的MAX()函数一样,不能直接用于WHERE子句,必须以子查询的形式。
实例14 AVG()函数作为WHERE子句中搜索条件的一部分
从TEACHER表中查询所有年龄高于平均年龄的教师的信息。实例代码:
SELECT *
FROM TEACHER
WHERE AGE >= (SELECT AVG (AGE) FROM TEACHER)
ORDER BY AGE
运行结果如图8.14所示。
图8.14 TEACHER表中所有年龄高于平均年龄的教师的信息
8.2.5 聚合分析的重值处理
前面介绍的5种聚合函数,可以作用于所选列中的所有数据(不管列中的数据是否有重置),也可以只对列中的非重值进行处理,即把重复的值只取一次进行聚合分析。当然,对于MAX()/MIN()函数来讲,重值处理意义不大。
可以使用ALL关键字指明对所选列中的所有数据进行处理,使用DISTINCT关键字指明对所选列中的非重值数据进行处理。以AVG()函数为例,语法如下。
SELECT AVG ([ALL/DISTINCT] column_name)
FROM table_name
说明:[ALL/DISTINCT]在缺省状态下,默认是ALL关键字,即不管是否有重值,处理所有数据。其他聚合函数的用法与此相同。
注意
Microsoft Access数据库不支持在聚合函数中使用DISTINCT关键字。
实例15 聚合分析的重值处理
从TEACHER表中查询工资SAL列中存在的所有记录数。实例代码:
SELECT COUNT(ALL SAL) AS ALLSAL_COUNT
FROM TEACHER
运行结果如图8.15所示。
图8.15 TEACHER表中工资SAL列中存在的所有记录数
当然,在代码中去除ALL关键字,也可以得到相同的结果。而如果从TEACHER表中,查询工资SAL列中存在的不同记录的数目,可采用如下代码。
SELECT COUNT(DISTINCT SAL) AS DISTINCTSAL_COUNT
FROM TEACHER
运行结果如图8.16所示。
图8.16 TEACHER表中SAL列存在的不同记录的数目
对比两个结果,使用DISTINCT关键字后,工资SAL列中的重值并没有列入统计的范围之内。另外还要强调一点,在所有5种聚合函数中,除了 COUNT(*)函数外,其他的函数在计算过程中都忽略NULL值,即把NULL值的行排除在外,不进行分析。
8.2.6 聚合函数的组合使用
前面介绍的实例中,聚合函数都是单独使用的。聚合函数也可以组合使用,即在一条SELECT语句中,可以使用多个聚合函数。
实例16 使用多个聚合函数
如下面的代码:
SELECT COUNT(*) AS num_items,
MAX(SAL) AS max_sal,
Min(AGE) AS min_age,
SUM(SAL)/COUNT(SAL) AS avg_sal,
AVG(DISTINCT SAL) AS disavg_sal
FROM TEACHER
运行结果如图8.17所示。
图8.17 聚合函数的组合应用
该例在一条SELECT语句中,几乎用到了所有的聚合函数。其中num_items为TEACHER表所有记录的条目,max_sal为 TEACHER表中记录的最高工资,min_age为TEACHER表中记录的最小年龄,avg_sal为所有TEACHER表中的工资记录的平均值,disavg_sal为TEACHER表中所有不同的工资记录的平均值。
分享到:
相关推荐
Spark-SQL常用聚合函数.md
常用聚合函数.sql
"SQL常用函数汇总" SQL 语言中有多种类型的函数,可以按照不同的分类方式来分类,下面将从函数类别、聚合函数、转换函数、加密函数、游标函数、日期和时间函数、数学函数、元数据函数、排名函数、行集函数、安全...
然而,有时系统内置的聚合函数无法满足特定需求,此时就需要利用C#来扩展SQL Server的功能,创建自定义的聚合函数,特别是针对字符串类型的处理。 字符串聚合函数是指能够处理字符串集合并返回单个字符串结果的函数...
4. **聚合函数**: - `COUNT()`: 计算行数或满足条件的行数。 - `SUM()`: 求和所有指定列的值。 - `AVG()`: 计算平均值。 - `MAX()` 和 `MIN()`: 找出最大值和最小值。 5. **转换函数**: - `CAST()` 和 `...
5. **聚合函数**:在查询中用于对一组值进行计算,如`COUNT()`统计行数,`SUM()`求和,`AVG()`计算平均值,`MAX()`和`MIN()`找出最大或最小值。 6. **系统信息函数**:如`@@ROWCOUNT`返回最后一条SQL语句影响的行数...
在SQL中,聚合函数如 `COUNT()`, `SUM()`, `AVG()`, `MAX()`, 和 `MIN()` 非常常用。`COUNT()` 计算非NULL值的数量,`SUM()` 求和,`AVG()` 计算平均值,`MAX()` 和 `MIN()` 分别找到最大值和最小值。例如,如果你有...
- `GROUP BY`:用于对数据进行分组,常与聚合函数一起使用。 - `OVER()`:定义窗口或分区,用于计算行集中的相对值,如排名或移动平均。 8. **其他特殊函数**: - `NEWID()`:生成一个新的全局唯一标识符(GUID...
常用的聚合函数: 指定列的总行数 count(col): 表示求指定列的总行数 指定列的最大值 max(col): 表示求指定列的最大值 指定列的最小值 min(col): 表示求指定列的最小值 指定列的和 sum(col): 表示求指定列的和 指定列...
### SQL常用命令 #### 数据操作语言(DML) 1. **SELECT**: 用于检索数据。例如,“SELECT * FROM table_name WHERE condition”会从指定表中选择满足条件的所有记录。 - 示例:`SELECT * FROM stock_information ...
三、聚合函数 1. AVG 函数:该函数返回数据集的平均值。例如:SELECT AVG(PRSTAFF) FROM PROJECT WHERE DEPTNO='D11'; 2. COUNT 函数:该函数返回数据集的记录行数。例如:SELECT COUNT(*) FROM EMPLOYEE WHERE ...
前言 大数据学习路线 大数据技术栈思维导图 大数据常用软件安装指南 一、Hadoop 分散文件存储系统 —— HDFS 多元计算框架——MapReduce 集群资源管理器 —— ...Spark SQL常用聚合函数 Spark SQL JOIN 操作 火花流:
1. **聚合函数**: - **COUNT()**: 用于计算行数,如`COUNT(*)`返回表中所有行数,`COUNT(column_name)`返回指定列非空值的数量。 - **SUM()**: 计算指定列的总和。 - **AVG()**: 计算指定列的平均值。 - **MAX...
6. **聚合函数**:COUNT、SUM、AVG、MAX、MIN等聚合函数用于对一组值进行计算,常用于统计和汇总数据。GROUP BY结合聚合函数可以实现数据的分组计算。 7. **子查询与连接查询**:子查询是在一个查询语句中嵌套另一...
3. **50个Sql语句**: 这可能是一个练习集,涵盖了SQL基础到进阶的各种操作,如SELECT、INSERT、UPDATE、DELETE等,也可能包含JOIN、子查询、聚合函数等复杂用法。 4. **完善SQL农历转换函数**: 农历转换函数是处理...
### SQL 分组查询和聚合函数详解 #### 一、引言 SQL 是一门强大的数据库查询语言,用于管理和操作关系型数据库。其中,分组查询和聚合函数是非常重要的组成部分,能够帮助用户快速有效地从大量数据中提取有用信息。...
在Oracle数据库中,分析函数和聚合函数是SQL查询中用于处理和汇总数据的重要工具。本文将详细介绍两者的主要功能和用法。 首先,我们关注的是排名函数。在Oracle中,有三种常用的排名函数: 1. `RANK()`: 这个函数...
这些函数大致可以分为几类:聚合函数、日期时间函数、数学函数以及字符串处理函数等。 ### 聚合函数 #### 1. **AVG()** - **功能**:计算指定列的平均值。 - **示例**:`SELECT AVG(Salary) FROM Employees;` ###...
4. **聚合函数**: - `COUNT()`:计算行数,可配合`*`或指定列。 - `SUM()`:求和。 - `AVG()`:平均值。 - `MAX()` / `MIN()`:最大值和最小值。 5. **转换函数**: - `CONVERT()`:将数据类型转换为另一种...
- 使用聚合函数:`GROUP BY`与`SUM()`, `COUNT()`, `AVG()`, `MAX()`, `MIN()`结合。 3. **联接查询(JOIN)**: - 内连接:`INNER JOIN`,匹配两个表中的记录。 - 左连接:`LEFT JOIN`,返回左表所有记录,即使...