前言:
如果我们要统计一张表的记录的数据量,平均数等计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询。
正文:
1. 聚合函数
常见的聚合函数有:
函数 | 说明 |
---|---|
COUNT() | 计算行数总量 |
SUM() | 计算某一列的和值,该列必须是数值类型 |
AVG() | 计算某一列的平均值,该列必须是数值类型 |
MAX() | 计算某一列的最大值 |
MIN() | 计算某一列的最小值 |
举几个例子:
SELECT COUNT(*) as num FROM students; #查询students表一共有多少条记录
SELECT COUNT(*) as boys FROM students WHERE gender = 'M'; #可以加WHERE过滤条件
SELECT AVG(score) as average FROM students WHERE gender = 'M'; #统计男生的平均成绩
注意:如果聚合查询的查询条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL。
2. 分组
如果我们要分别统计每班的学生数量,难道要不断修改WHERE查询条件吗?对于聚合查询,SQL还提供了“分组聚合”的功能,SQL提供了group by关键字,如下示例:
SELECT COUNT(*) as num FROM students GROUP BY class_id;
执行这个查询,COUNT()的结果不再是1个,而是按class_id分组后的组数。但是查出的结果并不能看出是那几个班的,所以需要班级信息也加入结果集中:
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id; #增加class_id
注意,这时如果我们把name字段加入到结果集中,查询时会报错,
SELECT name, class_id, COUNT(*) num FROM students GROUP BY class_id; #报错
报错信息是提示,name字段要么在group by之后,要么被聚合函数包裹。报错信息如下:
column "xxx" must appear in the GROUP BY clause or be used in an aggregate function
3. 分组后过滤
分组查询后,也可以制定一些条件来返回查询结果,分组后过滤使用having关键字,如统计工资总和大于9000的部门名称及工资总和:
SELECT department,SUM(salary) FROM employee
GROUP BY department HAVING SUM(salary) > 9000;
having的作用和where一样,但是having只能用于group by之后。having和where的区别有:
1、having是在分组后对数据进行过滤;having后面可以使用分组函数;
2、where是在分组前对数据进行过滤;where后面不可以使用分组函数;
where是在分组前进行过滤,如果某行记录没有满足where子句的条件,那么这条记录将不参与分组,而having是对分组后的数据的约束。
书写SQL语句的顺序是:
SELECT FROM WHERE GROUP BY HAVING ORDER BY LIMIT
总结:
聚合查询涉及到聚合函数与Group By分组的结合使用。