SQL 中 HAVING 和 WHERE 的区别及执行顺序详解

码头散步
码头散步
发布时间:2026-10-15| 4人浏览过
原创

在 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 查询优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。