聚合函数与分组数据
聚合函数:
COUNT
函数
使用COUNT
函数可以统计表中的记录个数。
语法格式:
SELECT COUNT(字段名/*)FROM 表名[WHERE 条件表达式];#当字段名作为函数参数时,如果该字段中没有NULL值,则与星号(*)作函数参数的效果相同#而如果字段中含有NULL值,则统计个数时会排除含有NUL值的记录
SUM
函数
使用SUM
函数可以求某字段众多个记录的和
语法格式:
SELECT SUM(字段名)FROM 表名[WHERE 条件表达式];#该函数的参数必须是数值字段或者结果为数值的表达式
AVG
函数
使用AVG
函数可以求某字段的平均值。
语法格式:
SELECT AVG(字段名)FROM 表名[WHERE 条件表达式];#该函数的参数必须是数值字段或者结果为数值的表达式
MIN
、MAX
函数
使用MIN
、MAX
函数可以求指定字段中的最大值、最小值。
语法格式:
SELECT MIN(字段名)FROM 表名[WHERE 条件表达式];SELECT MAX(字段名)FROM 表名[WHERE 条件表达式];#MIN和MAX两个函数可以用于文本类型、数值类型和日期时间类型的字段上#这两个函数都忽略含有MULL值的记录
统计汇总相异值(不同值)记录
统计某个字段中出现过的值(如:某一表中的地区字段中出现过几个地区)可以用`DISTINCT``关键字统计
语法格式
SELECT COUNT(DISTINCT 字段名)FROM 表名[WHERE 条件表达式];
聚合函数对NULL值的处理(总结)除了
COUNT
函数可以使用DISTINCT
外,上面介绍的4个聚合函数中也可以使用DISTINCT
关键字
COUNT
函数对NULL值的处理如果COUNT函数的参数为星号〔*),则统计所有记录的个数。
而如果参数为某字段,不统计含NULL值的记录个数,则应加上DISTINCT关键字。SUM
和AVG
函数对NULL值的处理
这两个函数忽略NULL值的存在,就好象该条记录不存在一样。MAX
和MIN
函数对NULL值的处理
这两个函数同样忽略NULL值的存在。
数据分组:
将表内容按列分组
GROUP BY
子句用来分组数据,首先,必须清楚一件事情,分组是根据指定字段的不同值划分的。例如,性别字段中只有2种值,因此,如果按性别字段分组数据就会产生两个组,又例如,假设所属院系字段值中有5种不同的值,则如果按所属院系分组就会产生五个组等。
语法格式:
SELECT 字段名FROM 表名GROUP BY 字段名|表达式(SELECT子句中出现过);#GROUP BY子句中的字段名必须在SELECT子句中的字段名出现过,否则会报错#且SELECT子句中的字段名最好不要使用*,若要使用则GROUP BY子句中须列出表中所有的字段名,否则会报错#分组时是按照GROUP BY子句后的字段名组合分组的,只有其后的字段名中的数据都相同才会别分为一组
聚合函数与分组配合使用
将数据分成小组的的很大原因是用于统计汇总,而统计汇总通常都要使用聚合函数,因此,聚合函数和分组经常被人们放在一起使用。
语法格式:
SELECT 使用了聚合函数的字段名FROM 表名GROUP BY 字段名|表达式(SELECT子句中出现过);
查询数据的直方图
直方图是表示不同实体之间数据相对分布的条状图。在一个查询语句中使用GROUP BY
子句,不仅可以查询数据,又可以格式化数据生成图表。
语法格式:
SELECT 字段名, RAPD(str1,length,str2)FROM 表名GROUP BY 字段名|表达式(SELECT子句中出现过);#其中RAPD函数中str1是第一个字符串,length是结果字符串的长度,str2是一个填充字符串#如果str1的长度没有length那么长,则使用str2填充;如果str1的长度大于length,则截断
排序分组结果
使用ORDER BY
子句排序分组结果,放在GROUP BY
子句的后面
语法格式:
SELECT 字段名FROM 表名GROUP BY 字段名|表达式(SELECT子句中出现过)ORDER BY 字段名 [ASC|DESC];
反转查询结果
在MySQL或sQL Server环境中,CASE
表达式和GROUP BY
子句联合使用会得到很多有用的数据表示,其中就包括反转查询结果的数据表示
语法格式:
SELECT 字段名,COUNT(CASE 表达式 THEN 1 ELSE NULL END),...FROM 表名GROUP BY 字段名|表达式(SELECT子句中出现过);
使用HAVING
子句设置分组查询结果
HAVING
子句用于设置分组查询条件,即过滤不需要的分组。该子句通常和GROUP BY
子句一起使用。
单独使用HAVING
子句没有太大的意义。
语法格式:
SELECT 字段名FROM 表名GROUP BY 字段名|表达式(SELECT子句中出现过)HAVING 条件表达式(如:字段名 IN 集合)ORDER BY 字段名 [ASC|DESC];
HAVING
子句与WHERE
子句的区别
HAVING
子句与WHERE
子句之后都写条件表达式,而且都会根据条件表达式的结果筛选数据。
但它们是有区别的,主要区别汇总如下:
❀HAVING
子句用于筛选组,而WHERE
子句用于筛选记录。
❀HAVING
子句中可以使用聚合函数,而WHERE子
句中不能使用聚合函数。
❀HAVING
子句中不能出现既不被GROUP BY
子句包含,又不被聚合函数包含的字段。而WHERE
子句中可以出现任意的字段。
❀HAVING
子句总是和GROUP BY子
句配合使用,而WHERE
子句可以不用任何子句的配合。