#HAVING的使用(作用:用来过滤数据)
#之前过滤数据用的是where
#GROUP BY分组之后,提到having
#从需求出发
#练习1:查询各个部门中最高工资比10000高的部门信息
#WHERE的写法(错
SELECT department_id,MAX(salary)
from employees
where MAX(salary) > 10000
GROUP BY department_id;
#正确写法::规范
-- 要求一:如果过滤条件中使用了聚合函数,则必需使用having
-- 要求二:having必须声明在GROUP BY的后面
SELECT department_id,MAX(salary)
from employees
GROUP BY department_id
HAVING MAX(salary) > 10000;
#练习2:思考没有GROUP BY还能不能用HAVING?
SELECT department_id,MAX(salary)
from employees
HAVING MAX(salary) > 10000;
-- 没有GROUP BY能运行having,但是在实际开发中,使用having的前提是SQL中使用了group by
#练习3:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
-- 方式一:执行效率高于方式二
SELECT department_id,MAX(salary)
from employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary)>10000;
-- 方式二
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000
AND department_id IN (10,20,30,40);
-- 结论一:当过滤条件中有聚合函数时,则此过滤条件必须声明在having中
-- 结论二:当过滤条件中没有聚合函数时,则此过滤条件声名在WHERE中或HAVING中都可以,但是建议大家声名在WHERE中
/*
WHERE 与 HAVING的对比
1 从适用范围上来讲,HAVING的适用范围更广
2如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING
*/