📚 目录
🛠️ 概述
HAVING
子句用于对 GROUP BY
结果进行过滤。在使用聚合函数(如 COUNT
、SUM
、AVG
等)时,HAVING
是用来对分组后的数据进行筛选的,通常在 GROUP BY
语句之后使用。与 WHERE
子句不同,WHERE
用于过滤原始数据,而 HAVING
用于过滤分组后的数据。
📝 基本语法
HAVING
子句的基本语法如下:
SELECT column1, column2, ..., aggregate_function(column)
FROM table_name
GROUP BY column1, column2, ...
HAVING aggregate_function(column) condition;
column1, column2, ...
:你希望分组的列。aggregate_function(column)
:用于对每个组进行聚合操作的函数(如COUNT
、SUM
、AVG
等)。condition
:定义聚合结果的过滤条件。
🔢 与 GROUP BY
一起使用
HAVING
子句通常与 GROUP BY
一起使用,用于对聚合后的结果进行筛选。
示例(返回员工数量超过 10 的部门):
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) > 10;
此查询返回员工数量超过 10 的部门。这里的 HAVING
用于过滤 GROUP BY
后的部门数据。
🔢 过滤聚合结果
HAVING
允许你对聚合结果进行过滤。比如,在计算总薪资、平均薪资时,可以使用 HAVING
来筛选符合特定条件的结果。
示例(筛选薪资总和大于 500,000 的部门):
SELECT department, SUM(salary)
FROM employees
GROUP BY department
HAVING SUM(salary) > 500000;
此查询返回薪资总和大于 500,000 的部门。
🔄 与 WHERE
的区别
WHERE
:在数据分组之前过滤原始数据,不能用于聚合函数。HAVING
:在数据分组后过滤聚合结果,通常与聚合函数一起使用。
示例(WHERE
和 HAVING
配合使用):
SELECT department, SUM(salary)
FROM employees
WHERE hire_date >= '2020-01-01'
GROUP BY department
HAVING SUM(salary) > 500000;
此查询首先通过 WHERE
子句筛选出 2020 年后入职的员工,然后按部门分组,并返回薪资总和大于 500,000 的部门。
🔢 结合 HAVING
和 ORDER BY
HAVING
子句可以与 ORDER BY
一起使用,用于对分组后的数据进行排序。
示例(按部门薪资总和排序):
SELECT department, SUM(salary)
FROM employees
GROUP BY department
HAVING SUM(salary) > 500000
ORDER BY SUM(salary) DESC;
此查询首先筛选出薪资总和大于 500,000 的部门,然后按薪资总和降序排序。
📘 参考资料
- PostgreSQL 官方文档:HAVING
- 更多 PostgreSQL 查询技巧整理自:www.52kanjuqing.com
发表回复