SQL 中 HAVING 和 WHERE 的区别及执行顺序详解
在 SQL 查询中,WHERE 和 HAVING 虽然都起到过滤数据的作用,但它们的工作阶段和应用对象截然不同。核心区别在于:WHERE 作用于分组之前,排除不符合条件的单行,且不支持聚合函数;而 HAVING 作用于分组之后,筛选符合聚合条件的组。掌握这一执行顺序是编写高效 SQL 的关键。
结果与目标
通过本文,你将明确区分何时使用 WHERE,何时使用 HAVING,并能正确撰写包含分组与复杂过滤条件的 SQL 语句。
准备条件
- 了解基本的 SQL
SELECT语法。 - 熟悉
GROUP BY子句如何将数据划分为组。 - 理解聚合函数(如
SUM(),COUNT(),MAX())的概念。
真实操作顺序与原理解析
第1步:理解 WHERE 的执行位置与作用
目的:在数据进入分组计算前,先剔除无关数据,提高处理效率。
说明:WHERE 子句在 GROUP BY 之前执行。它针对的是原始数据表中的每一行。因此,WHERE 后面只能接列名或常量表达式,绝不能使用聚合函数。
示例:从员工表中筛选薪资大于 1200 的员工记录。
SELECT deptno, sal FROM emp WHERE sal > 1200;
第2步:理解 GROUP BY 的分组机制
目的:将符合条件的行按指定列的值归类。
说明:GROUP BY 将查询结果按照指定的表达式(如部门号)分成多个组。此时,SELECT 列表中除了作为分组依据的列外,其他列必须包含在聚合函数中。
示例:统计每个部门的最高薪资。
SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;
第3步:应用 HAVING 进行组级过滤
目的:在分组完成后,筛选出满足特定聚合条件的组。
说明:HAVING 子句在 GROUP BY 之后执行。它的主要特点是支持并使用聚合函数作为条件。如果同时存在 WHERE 和 HAVING,先由 WHERE 过滤行,再由 GROUP BY 分组,最后由 HAVING 过滤组。
完整流程示例:查询平均薪资大于 2000 的部门及其最高薪资。
SELECT deptno, MAX(sal)
FROM emp
GROUP BY deptno
HAVING AVG(sal) > 2000;
另一个常见场景是结合 WHERE 和 HAVING:WHERE 先过滤掉低薪员工,GROUP BY 再分组,HAVING 最后筛选总薪资超过阈值的部门。
SELECT deptno, SUM(sal)
FROM emp
WHERE sal > 1200
GROUP BY deptno
HAVING SUM(sal) > 8500;
ORDER BY deptno;
第4步:多字段分组的应用
目的:更精细地分析数据。
说明:可以在 GROUP BY 后指定多个列,实现更细粒度的分组。例如,统计“每个部门”下“每种职位”的人数。
SELECT deptno, job, COUNT(*)
FROM emp
GROUP BY deptno, job;
完成判断
- 若条件是普通列值比较(如
sal > 1200),放在WHERE中。 - 若条件是聚合函数比较(如
COUNT(*) > 5或AVG(sal) > 2000),必须放在HAVING中。 - 执行顺序牢记:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
简要总结
WHERE 是行级过滤器,发生在分组前;HAVING 是组级过滤器,发生在分组后。WHERE 不能用聚合函数,HAVING 则主要依赖聚合函数。合理搭配两者,既能利用索引提升性能,又能准确获取统计结果。
以上就是 SQL 中 HAVING 和 WHERE 区别分析的详细内容,更多关于 SQL 查询优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









