SQL中WHERE和HAVING的区别

个人博客

在 SQL 查询中,WHEREHAVING 都用于对查询结果进行过滤,但它们在使用场景和作用对象上存在明显的区别。

1. WHERE 子句

WHERE 用于过滤原始数据,它作用于从表中提取的记录,对数据在分组之前进行过滤。

特点
  • WHERE 只能用于过滤表中的原始行,在数据进行分组操作(GROUP BY)之前执行。
  • WHERE 子句不能用于聚合函数(如 SUM()COUNT()AVG() 等),因为在 WHERE 子句执行时,聚合操作尚未发生。
  • 用于非聚合的条件过滤。
语法
SELECT column1, column2, ...
FROM table_name
WHERE condition;
举例说明
SELECT name, age
FROM employees
WHERE age > 30;

在这个查询中,WHERE 子句过滤所有 age 大于 30 的记录,查询结果将只包含符合条件的行。


2. HAVING 子句

HAVING 子句通常与分组操作GROUP BY)一起使用,作用于分组后的数据,对聚合后的结果进行过滤。

特点
  • HAVING 用于过滤已经分组后的结果
  • HAVING 支持使用聚合函数(如 SUM()COUNT()AVG() 等),可以针对分组后的聚合结果进行过滤。
  • 通常和 GROUP BY 搭配使用。
语法
SELECT column1, aggregate_function(column2), ...
FROM table_name
GROUP BY column1
HAVING condition;
举例说明
SELECT department, COUNT(*) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;

在这个查询中,HAVING 子句过滤那些员工人数大于 5 的部门。这里 COUNT(*) > 5 是对聚合结果的过滤,而不是对原始数据的过滤。


3. WHERE 和 HAVING 的主要区别

特点WHEREHAVING
作用阶段分组前过滤数据分组后过滤数据
适用于聚合函数不能用于聚合函数可以与聚合函数一起使用
使用场景用于过滤表中的原始数据用于过滤聚合后的数据
语法位置位于 GROUP BY 之前位于 GROUP BY 之后
应用示例过滤单行数据,如 WHERE age > 30过滤聚合数据,如 HAVING COUNT(*) > 5

4. 综合实例:WHERE 和 HAVING 的联合使用

有时,我们需要同时使用 WHEREHAVING 来分别过滤原始数据和聚合后的结果。

SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE age > 30  -- 对原始数据进行过滤
GROUP BY department
HAVING AVG(salary) > 50000;  -- 对聚合结果进行过滤
  • WHERE age > 30:先过滤出年龄大于 30 的员工。
  • HAVING AVG(salary) > 50000:然后对分组后的结果过滤出平均工资大于 50000 的部门。

5. 总结

  • WHERE分组前过滤数据,不能用于聚合函数。
  • HAVING分组后过滤数据,适用于聚合函数。
  • 两者可以结合使用,先用 WHERE 过滤原始数据,再用 HAVING 过滤聚合后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡耀超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值