HAVING 子句在 SQL 中通常和 GROUP BY 配合使用,用来对分组后的结果进行筛选。
可以把它理解成:WHERE 筛选行,HAVING 筛选组。
SELECT 列, 聚合函数()
FROM 表
WHERE 条件
GROUP BY 列
HAVING 分组后的筛选条件;
执行顺序:
FROMWHERE(先过滤原始数据)GROUP BY(分组)HAVING(过滤分组结果)| 对比项 | WHERE | HAVING |
|---|---|---|
| 作用对象 | 行 | 分组 |
| 是否可用聚合函数 | ❌ 不可以 | ✅ 可以 |
| 执行时机 | 分组前 | 分组后 |
统计每个部门的员工数,只显示人数大于 3 的部门:
SELECT dept_id, COUNT(*) AS emp_count
FROM employee
GROUP BY dept_id
HAVING COUNT(*) > 3;
查询平均工资大于 5000 的部门:
SELECT dept_id, AVG(salary) AS avg_sal
FROM employee
GROUP BY dept_id
HAVING AVG(salary) > 5000;
先排除离职员工,再统计部门人数:
SELECT dept_id, COUNT(*) AS emp_count
FROM employee
WHERE status = 'active'
GROUP BY dept_id
HAVING COUNT(*) >= 5;
SELECT dept_id, AVG(salary) AS avg_sal
FROM employee
GROUP BY dept_id
HAVING AVG(salary) > 5000 AND COUNT(*) > 10;
❌ 在 WHERE 中使用聚合函数:
WHERE COUNT(*) > 3 -- 错误
✅ 正确写法:
HAVING COUNT(*) > 3
如果你愿意,我也可以结合你正在用的数据库(MySQL / Oracle / SQL Server)或具体业务场景给你写示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。