我们上一章讲到了sQL单行函数。实际上sQL函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。
1.聚合函数介绍
1.1 AVG和SUM函数
1.2MIN和MAX函数
1.3 COUNT函数
2.GROUP BY
2.1基本使用
2.2使用多个列分组
2.3 GROUP BY中使用WITH ROLLUP
3.HAVING(用来过滤数据)
3.1基本使用
- 要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
\- 要求2:HAVING 必须声明在GROUP BY的后面。
\- 要求3:开发中,我们使用HAVING的前提是SQL中使用了GROUP BY。
#练习:查询各个部门中最高工资比10000高的部门信息
#错误写法
SELECT department_id,MAX(salary)
FROM employees
WHERE MAX(salary) > 10000
GROUP BY department_id;#要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
#要求2:HAVING 必须声明在GROUP BY的后面。
#要求3:开发中,我们使用HAVING的前提是sQL中使用了GROUP BY。#正确的写法:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;
#练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
#方式1:
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary) > 10000 ;
#方式2:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000 AND department_id IN(10,20,30,40) ;
3.2 WHERE和HAVING的对比
- 从适用范围上来讲,HAVING的适用范围更广。
- 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING
#练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
#方式1:
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary) > 10000 ;
#方式2:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000 AND department_id IN(10,20,30,40) ;
-
问题一:有组函数只能使用HAVING,没有组函数的也可以使用HAVING,WHERE还有用嘛?
-
- 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。
当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。建议声明在WHERE中
- 当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。
-
问题二:WHERE也行,HAVING也行,建议使用哪一种呢?哪一种效率高呢?
-
- 存在即合理。推荐使用方式1,因为执行效率更高
4.SELECT的执行过程
4.1查询的结构
4.2 SELECT执行顺序
4.3 SQL的执行原理
练习