基本操作
HAVING的使用 (作用:用来过滤数据的)
- 行已经被分组。
- 使用了聚合函数。
- 满足HAVING 子句中条件的分组将被显示。
- HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。
- SELECT中出现在非聚合函数中的字段必须出现在GROUP BY中
1、如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。 2、HAVING 必须声明在 GROUP BY 的后面。 3、开发中,我们使用HAVING的前提是SQL中使用了GROUP BY(使用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:推荐,执行效率高于方式2.
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中。
当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE中。
WHERE 与 HAVING 的对比
WHERE是先筛选后连接,HAVING是先连接后筛选
- 从适用范围上来讲,HAVING的适用范围更广。
- 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING
SQL底层执行原理
sql92语法
:
SELECT …,…,…(存在聚合函数)
FROM …,…,…
WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
GROUP BY …,…
HAVING 包含聚合函数的过滤条件
ORDER BY …,…(ASC / DESC )
LIMIT …,…
sql99语法
:
SELECT …,…,…(存在聚合函数)
FROM … (LEFT / RIGHT)JOIN …ON 多表的连接条件
(LEFT / RIGHT)JOIN … ON …
WHERE 不包含聚合函数的过滤条件
GROUP BY …,…
HAVING 包含聚合函数的过滤条件
ORDER BY …,…(ASC / DESC )
LIMIT …,…
SQL语句的执行过程
FROM …,…-> ON -> (LEFT/RIGNT JOIN) -> WHERE -> GROUP BY(分组) -> HAVING(筛选) -> SELECT -> DISTINCT(去重) -> ORDER BY(排序) -> LIMIT(分页)