如果过滤条件中使用了聚合函数,则必须使用HAVING
代替WHERE
,且HAVING
必须声明在GROUP BY
的后面。通常,HAVING
不会单独使用,会和GROUP BY
一起使用。
如果过滤条件中没有聚合函数,可以使用WHERE
或HAVING
。但推荐使用WHERE
,因为WHERE
的执行效率更高。
- 查询各部门最高工资大于10000的部门信息。
# 查询各个部门最高工资比10000高的部门信息
# 错误示例
SELECT MAX(salary),department_id
FROM employees
WHERE MAX(salary) > 10000
GROUP BY department_id; -- 报错:Invalid use of group function
# 正确示例
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000; -- 返回6行记录
/*
MAX(salary) department_id
13000.00 20
11000.00 30
14000.00 80
24000.00 90
12000.00 100
12000.00 110
*/
- 查询部门id为10,20,30,40的部门的最高工资大于10000的部门信息。
# 查询部门id为10,20,30,40的部门的最高工资大于10000的部门信息
# 方式1:推荐,因为执行效率更高
SELECT MAX(salary),department_id
FROM employees
WHERE department_id IN (10,20,30,40)
GROUP BY department_id
HAVING MAX(salary)> 10000; -- 返回2行记录
/*
MAX(salary) department_id
13000.00 20
11000.00 30
*/
# 方式2
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000
AND department_id IN (10,20,30,40); -- 返回2行记录