在 SQL 中,HAVING 子句的存在,核心原因是:WHERE 子句不能直接筛选“分组之后的聚合结果”。
下面分点说明为什么要用 HAVING。
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;
执行顺序大致是:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
WHERE:筛选原始数据行GROUP BY:分组HAVING:筛选分组后的结果-- 找出平均薪资大于 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;
SELECT dept, COUNT(*)
FROM employee
WHERE status = 'active'
GROUP BY dept
HAVING COUNT(*) > 10;
WHERE:先排除离职员工HAVING:再筛选部门人数HAVING 子句用于对 GROUP BY 分组后的聚合结果进行过滤,而 WHERE 只能过滤原始数据行。
如果你愿意,我也可以用图示 / 对比表 / 真实业务例子再讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。