SQL 中不能轻视的 HAVING 子句
SQL 是一种强大的数据库查询语言,它允许我们在大量数据中搜索、计算和汇总信息。在查询中,对数据进行过滤是常见的需求,当我们在过滤时,常用 WHERE 和 HAVING。这两者的区别看似简单,但在实际应用中并不容易分清。
在本文中,我们将深入解析 HAVING 的功能,了解它的用法,以及它和 WHERE 子句的区别。通过许多实际案例,我们将完整地分析 HAVING 在 SQL 中的实际应用。
目录
HAVING 子句概述
1. HAVING 的基本语法
2. WHERE 和 HAVING 的区别
HAVING 子句的应用实例
案例 1:计算每个部门的员工数,并筛选员工数大于 3 的部门
案例 2:筛选平均薪资高于 5000 的部门
案例 3:同时使用 WHERE 和 HAVING
HAVING 子句的高级用法
1. 使用多重条件筛选
2. 使用 HAVING 进行范围筛选
3. 结合 ORDER BY 进行排序
HAVING 子句的优化策略
总结
HAVING 子句概述
HAVING 子句专门用于 对聚合数据进行过滤,即它用于 GROUP BY 语句的结果集。在执行 SQL 查询时,我们通常先用 WHERE 过滤原始数据,然后用 HAVING 对分组后的数据进行进一步筛选。
1. HAVING 的基本语法
SELECT 列名, 聚合函数 FROM 表名 GROUP BY 列名 HAVING 条件;
2. WHERE 和 HAVING 的区别
对比项 | WHERE 子句 | HAVING 子句 |
---|---|---|
作用范围 | 作用于 单行数据 | 作用于 聚合后的数据 |
作用对象 | 普通列 | 聚合函数 (SUM、AVG、COUNT 等) |
使用场景 | 过滤原始数据 | 过滤聚合后的数据 |
语法位置 | 在 GROUP BY 之前 | 在 GROUP BY 之后 |
计算影响 | 影响分组前的数据集大小 | 影响分组后的数据集大小 |
在 SQL 查询优化中,推荐 尽可能使用 WHERE 进行初步筛选,以减少 GROUP BY 需要处理的数据量,从而提升查询效率。
HAVING 子句的应用实例
案例 1:计算每个部门的员工数,并筛选员工数大于 3 的部门
SELECT department, COUNT(*) AS emp_count FROM employees GROUP BY department HAVING COUNT(*) > 3;
📌 解析:
-
GROUP BY department 按部门分组。
-
COUNT(*) 计算每个部门的员工数量。
-
HAVING COUNT(*) > 3 只保留 员工数量大于 3 的部门。
案例 2:筛选平均薪资高于 5000 的部门
SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 5000;
📌 解析:
-
计算 department 组内的平均薪资。
-
HAVING 过滤掉 平均薪资低于 5000 的部门。
案例 3:同时使用 WHERE 和 HAVING
SELECT department, SUM(salary) AS total_salary FROM employees WHERE salary > 3000 GROUP BY department HAVING SUM(salary) > 20000;
📌 解析:
-
WHERE salary > 3000 先筛选 工资高于 3000 的员工。
-
GROUP BY department 按部门分组。
-
HAVING SUM(salary) > 20000 只保留 薪资总和大于 20000 的部门。
HAVING 子句的高级用法
1. 使用多重条件筛选
SELECT department, COUNT(*) AS emp_count, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING COUNT(*) > 5 AND AVG(salary) > 6000;
📌 解析:
-
HAVING 支持逻辑运算符 AND、OR 组合多个条件。
-
过滤掉 员工数少于 5 或者平均薪资低于 6000 的部门。
2. 使用 HAVING 进行范围筛选
SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department HAVING SUM(salary) BETWEEN 10000 AND 50000;
📌 解析:
-
HAVING SUM(salary) BETWEEN 10000 AND 50000 过滤 薪资总和在 10000 到 50000 之间的部门。
3. 结合 ORDER BY 进行排序
SELECT department, COUNT(*) AS emp_count FROM employees GROUP BY department HAVING COUNT(*) > 3 ORDER BY COUNT(*) DESC;
📌 解析:
-
ORDER BY COUNT(*) DESC 按 员工数降序排列,以便快速查看最大部门。
HAVING 子句的优化策略
-
尽量使用 WHERE 进行初步筛选,减少数据规模,提高 GROUP BY 计算效率。
-
避免在 HAVING 语句中进行复杂计算,可以将计算结果存入临时表,提高查询性能。
-
使用索引优化分组字段,如果 GROUP BY 作用在大表的字段上,可以考虑创建索引,以提升查询速度。
总结
-
HAVING 主要用于 对聚合结果进行筛选,而 WHERE 用于 单行数据的筛选。
-
在 SQL 查询优化时,推荐 优先使用 WHERE 过滤原始数据,然后在 HAVING 里进行聚合数据筛选。
-
HAVING 适用于 COUNT、SUM、AVG、MAX、MIN 等聚合函数的筛选,配合 ORDER BY 可以更方便地分析数据。
通过合理使用 HAVING,可以有效优化 SQL 查询,提高数据库操作的效率。
-
-
-
-
-
-