Having子句

文章详细介绍了SQL查询中WHERE子句和HAVING子句的区别,WHERE在数据过滤时先于GROUPBY执行,适用于不包含聚合函数的条件;而HAVING则在数据分组后过滤,适合处理包含聚合函数的条件。同时,文章阐述了SQL的执行顺序,包括FROM,JOIN,WHERE,GROUPBY,HAVING,SELECT,DISTINCT,ORDERBY和LIMIT步骤,并提供了示例来帮助理解。
摘要由CSDN通过智能技术生成

基本操作

HAVING的使用 (作用:用来过滤数据的)

  1. 行已经被分组。
  2. 使用了聚合函数。
  3. 满足HAVING 子句中条件的分组将被显示。
  4. HAVING 不能单独使用,必须要跟 GROUP BY 一起使用。
  5. 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是先连接后筛选

  1. 从适用范围上来讲,HAVING的适用范围更广。
  2. 如果过滤条件中没有聚合函数:这种情况下,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(分页)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值