简短结论:HAVING 不能替代 WHERE,两者用途不同,也不能互相完全替代。
下面详细说明:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
| 子句 | 过滤对象 | 是否可用聚合函数 |
|---|---|---|
| WHERE | 原始行 | ❌ 不可以 |
| HAVING | 分组后的结果 | ✅ 可以 |
SELECT department, COUNT(*)
FROM employees
HAVING salary > 5000;
❌ 问题:
salary 是单行字段GROUP BYHAVING 不能用来过滤单行✅ 正确写法:
SELECT department, COUNT(*)
FROM employees
WHERE salary > 5000
GROUP BY department;
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10;
✅ 这里过滤的是「分组结果」
技术上有时可以,但不推荐
SELECT department, COUNT(*)
FROM employees
GROUP BY department, salary
HAVING salary > 5000;
问题:
✅ 最佳实践:能用 WHERE 就用 WHERE
WHERE 过滤“行”,HAVING 过滤“组”;HAVING 不能替代 WHERE,只是补充。
如果你愿意,我也可以给你画一个执行流程图或结合你用的数据库(MySQL / Oracle / PostgreSQL)讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。