目录
[二、GROUP BY](#二、GROUP BY)
一、聚合函数
1.定义
聚合函数作用于一组数据,并对一组数据返回一个值。
2.类型
AVG()、 SUM() 、MAX() 、MIN() 、COUNT()
3.语法介绍
(1)AVG和SUM函数
可以对数值型数据使用AVG 和 SUM 函数。
sql
SELECT AVG(grade), MAX(grade),MIN(grade), SUM(grade)
FROM students
WHERE student_id LIKE '%s%';
(2)MIN和MAX函数
可以对任意数据类型的数据使用 MIN 和 MAX 函数。
sql
SELECT MIN(age), MAX(age)
FROM students;
(3)COUNT函数
COUNT(*)返回表中记录总数,适用于任意数据类型。
sql
SELECT COUNT(*)
FROM students
WHERE classnumber = 2;
COUNT(expr) 返回expr不为空的记录总数。
sql
SELECT COUNT(grade)
FROM subject
WHERE subject_id = 1;
- count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。
- 不要使用 count(列名)来替代 count(*),count(*)是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
二、GROUP BY
1.基本使用
可以使用GROUP BY子句将表中的数据分成若干组
模板:
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
注意:
WHERE一定放在FROM后面,在SELECT列表中所有未包含在组函数中的列都应该包含在 GROUP BY子句中。
包含在 GROUP BY 子句中的列不必包含在SELECT 列表中。
sql
SELECT AVG(grade)
FROM class
GROUP BY class_id ;
2.使用多个列分组
sql
SELECT class_id , student_id, SUM(grade)
FROM employees
GROUP BY class_id, student_id ;
使用WITH ROLLUP关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。
注意:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。
sql
SELECT class_id,AVG(grade)
FROM class
WHERE class_id > 5
GROUP BY class_id WITH ROLLUP;
三、HAVING
1.基本使用
过滤分组
- 行已经被分组。
- 使用了聚合函数。
- 满足HAVING 子句中条件的分组将被显示。
- HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。
- 非法使用聚合函数 : 不能在 WHERE 子句中使用聚合函数。
sql
SELECT class_id, MAX(grade)
FROM students
GROUP BY class_id
HAVING MAX(grade)>100;
2.WHERE和HAVING的对比
(1)区别1:
WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;
HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。
(2)区别2:
如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选。
四、SELECT的执行过程
1.查询的书写结构方式
(1)方式一:
SELECT ...,....,...
FROM ...,...,....
WHERE 多表的连接条件
AND 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
(2)方式二:
#方式2:
SELECT ...,....,...
FROM ... JOIN ...
ON 多表的连接条件
JOIN ...
ON ...
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...
(3)说明
- from:从哪些表中筛选
- on:关联多表查询时,去除笛卡尔积
- where:从表中筛选的条件
- group by:分组依据
- having:在统计结果中再次筛选
- order by:排序
- limit:分页
2.查询的执行结构方式
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
总结
本篇对SQL语句中的聚合函数进行了讲解,便于理解和复习。文章部分内容源自网络,如有侵权,请联系作者删除,谢谢!