聚合分析
在访问数据库时,常常需要对表中的某一列数据进行统计分析,比如求其最大值、最小值、平均值等。这些分析都是针对一个或多个表中的一列或多列数据进行的。表称为聚合分析。
在SQL中,可以使用聚合函数来快速实现数据的聚合分析。 与第7章介绍的SQL中的函数不同,聚合函数处理列中的一系列数据并返回单个统计值; 而前一个函数处理列中的单个数据。
聚合函数
和()
返回所选结果集中所有值的总和
最大限度()
返回所选结果集中所有值的最大值
最小值()
返回所选结果集中所有值的最小值
平均值()
返回所选结果集中所有值的平均值
数数()
返回所选结果集中的行数
和()
SUM(SAL) AS FROM WHERE TSEX='Male'
对一列数据求和时,如果该列中存在 NULL 值,SUM 函数将忽略该值。 (加上所有还对每列求和)
数数()
您必须指定列名或使用星号,这意味着计算表中的所有记录。 两种使用形式如下。
* COUNT(*),计算表中的总行数,即使表中行中的数据为NULL,也包括在内。
* COUNT(),计算列中包含的行数。 如果该列中某行的数据为NULL,则该行不计入统计总计。
注意
COUNT(*) 函数会准确返回表中的总行数,而 COUNT() 函数只有在 COUNT() 函数的参数列不包含 NULL 值时才会返回表中正确的行数,因此只有当列受 NOT NULL 作为参数限制时,才可以使用 COUNT() 函数来代替 COUNT(*) 函数。
计数(TNO) AS 、计数(TNAME) AS 、计数(SAL) AS
从
使用 COUNT( ) 函数对多列中的数据进行计数
如果要统计多列,需要通过连接器连接多列待统计的列,并将其作为COUNT()函数的参数。
(还没有例子,稍后我会补充)
最大值/最小值函数—MAX()/MIN()
列中的数据可以是数字、字符串或日期时间数据类型。 MAX()/MIN() 函数将返回与传递的列数据类型相同的单个值
这是一个典型的例子。
MAX (AGE) AS FROM(取最年长的老师)
但通常拿出来后,你需要看到老师的基本信息,比如姓名、性别、从业年限等。
但是SQL不支持下面的语句
TNAME、DNAME、TSEX、最大(年龄)来自
那么我们应该做什么呢?
TNAME、DNAME、TSEX、SAL、年龄来自
WHERE AGE=MAX (AGE) 就可以了
当列类型为字符串或日期时
均值函数——AVG()
AVG() 函数实际上是将列中的值相加,然后将总和除以非 NULL 值的数量。 因此,与SUM()函数一样,AVG()函数只能对数值数据进行操作,即列中的数据必须是数值。
平均 () 来自
当你想显示其他信息时,比如姓名、年龄等,方法如下
* 从
其中年龄 >=(平均(年龄)来自)
按年龄订购
用于聚合分析的重值处理
5种聚合函数可以应用于所选列中的所有数据(无论该列中的数据是否已重置),或者只能处理该列中的非重复值,即只取重复一次的值用于聚合分析。 当然,对于MAX()/MIN()函数来说,重值处理意义不大。
您可以使用 ALL 关键字指定应处理所选列中的所有数据,并使用 ALL 关键字指定应处理所选列中的非重复数据。 以AVG()函数为例,语法如下。
平均值([全部/])
从
与聚合函数密不可分的就是分组。
GROUP BY 子句创建组
, 总和()
从表
通过...分组
说明:GROUP BY 子句根据列中的数据对行进行分组,即将具有相同值的行分组在一起。 一般与聚合函数一起使用。 当然,这里的SUM()函数也可以是其他聚合函数。 所有组合列(GROUP BY 子句中列出的列)必须来自 FROM 子句中列出的表。 不能根据实际值、聚合函数结果或其他表达式计算的值对行进行分组。
GROUP BY 子句根据多列组合行
DNAME、TSEX、COUNT(*) AS
从
按 DNAME、TSEX 分组
运算符和CUBE运算符主要用于扩展,暂时不写。 它们将在稍后添加。
条款
GROUP BY 子句只是对所选列中的数据进行分组,并对该列中具有相同值的行进行分组。 在实际应用中,经常需要删除不满足条件的行组。 为了实现这个功能,SQL提供了子句。 语法如下。
, 总和()
从表
通过...分组
SUM() 值
注意:通常与 GROUP BY 子句一起使用。 当然,语法中的SUM()函数也可以是任何其他聚合函数。 DBMS 将子句中的搜索条件应用于 GROUP BY 子句生成的行组。 如果行组不满足搜索条件,则会从结果表中删除。
子句和 WHERE 子句
子句与 WHERE 子句类似,也定义搜索条件。 但与 WHERE 子句不同的是,该子句与组相关,而不是与各个行相关。
* 如果指定了 GROUP BY 子句,则该子句定义的搜索条件将应用于由该 GROUP BY 子句创建的组。
* 如果指定 WHERE 子句而不指定 GROUP BY 子句,则子句中定义的搜索条件将作用于 WHERE 子句的输出,并将该输出视为一个组。
* 如果既没有指定 GROUP BY 子句,也没有指定 WHERE 子句,则该子句定义的搜索条件将作用于 FROM 子句的输出,并将该输出视为一个组。
1.
DNAME,计数(TSEX)为
从
WHERE TSEX='女性'
按 DNAME 分组
2.
DNAME,计数(TSEX)为
从
按 DNAME 分组
TSEX='女性'