温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

为什么要用HAVING子句

发布时间:2026-11-01 12:59:07 来源:亿速云 阅读:101 作者:小樊 栏目:数据库

在 SQL 中,HAVING 子句的存在,核心原因是:WHERE 子句不能直接筛选“分组之后的聚合结果”。

下面分点说明为什么要用 HAVING。


1. WHERE 只能过滤“行”,不能过滤“组”

  • WHERE 在 分组前 生效
  • 它只能使用原始表的列
  • 不能使用 COUNT()、SUM()、AVG() 等聚合函数

❌ 错误示例:

SELECT dept, COUNT(*)
FROM employee
WHERE COUNT(*) > 5
GROUP BY dept;

报错:WHERE 中不能使用聚合函数

✅ 正确写法(用 HAVING):

SELECT dept, COUNT(*)
FROM employee
GROUP BY dept
HAVING COUNT(*) > 5;

2. HAVING 是对“分组结果”进行筛选

执行顺序大致是:

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
  • WHERE:筛选原始数据行
  • GROUP BY:分组
  • HAVING:筛选分组后的结果

3. 典型使用场景

场景一:筛选聚合结果

-- 找出平均薪资大于 8000 的部门
SELECT dept, AVG(salary)
FROM employee
GROUP BY dept
HAVING AVG(salary) > 8000;

场景二:多条件分组过滤

-- 每个部门人数 > 3 且最大薪资 < 20000
SELECT dept
FROM employee
GROUP BY dept
HAVING COUNT(*) > 3 AND MAX(salary) < 20000;

4. HAVING 和 WHERE 可以一起用

SELECT dept, COUNT(*)
FROM employee
WHERE status = 'active'
GROUP BY dept
HAVING COUNT(*) > 10;
  • WHERE:先排除离职员工
  • HAVING:再筛选部门人数

一句话总结

HAVING 子句用于对 GROUP BY 分组后的聚合结果进行过滤,而 WHERE 只能过滤原始数据行。

如果你愿意,我也可以用图示 / 对比表 / 真实业务例子再讲一遍。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手