📚 目录

  1. 概述
  2. 基本语法
  3. GROUP BY 一起使用
  4. 过滤聚合结果
  5. WHERE 的区别
  6. 结合 HAVINGORDER BY
  7. 参考资料

🛠️ 概述

HAVING 子句用于对 GROUP BY 结果进行过滤。在使用聚合函数(如 COUNTSUMAVG 等)时,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):用于对每个组进行聚合操作的函数(如 COUNTSUMAVG 等)。
  • 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:在数据分组后过滤聚合结果,通常与聚合函数一起使用。

示例(WHEREHAVING 配合使用):

SELECT department, SUM(salary)
FROM employees
WHERE hire_date >= '2020-01-01'
GROUP BY department
HAVING SUM(salary) > 500000;

此查询首先通过 WHERE 子句筛选出 2020 年后入职的员工,然后按部门分组,并返回薪资总和大于 500,000 的部门。


🔢 结合 HAVINGORDER BY

HAVING 子句可以与 ORDER BY 一起使用,用于对分组后的数据进行排序。

示例(按部门薪资总和排序):

SELECT department, SUM(salary)
FROM employees
GROUP BY department
HAVING SUM(salary) > 500000
ORDER BY SUM(salary) DESC;

此查询首先筛选出薪资总和大于 500,000 的部门,然后按薪资总和降序排序。


📘 参考资料