跳到主要内容

SQL中的HAVING子句

提示
  1. 过滤聚合结果:SQL 的 HAVING 子句用于根据聚合函数(如 MIN(), MAX(), SUM(), AVG(), COUNT())对结果集进行过滤。
  2. 基本语法HAVING 子句的语法为 SELECT AggFunc(column), extra_columns FROM table GROUP BY target_column HAVING condition,其中 AggFunc(column) 是聚合函数,condition 是过滤条件。
  3. WHERE 的区别HAVING 子句用于对一组行应用条件,通常与 GROUP BY 结合使用,而 WHERE 子句用于过滤每个单独行,且不能与聚合函数一起使用。

SQL 的 HAVING 子句用于根据聚合函数(如 MIN() 和 MAX()SUM() 和 AVG(),和 COUNT())过滤结果集。

示例

SELECT COUNT(age) AS Count, first_name
FROM Customers
GROUP BY first_name
HAVING COUNT(age) > 1;

这里,SQL 命令

  • 计算每行的 age 并按 first_name 分组
  • 如果 age 的计数大于 1,则返回结果集(从而过滤出具有相同 first_name 的客户)

SQL HAVING 语法

SQL HAVING 子句的语法是:

SELECT AggFunc(column), extra_columns
FROM table
GROUP BY target_column
HAVING condition

这里,

  • AggFunc(column) 指的是应用于列的任何聚合函数
  • extra_columns 是其他额外的列以进行过滤
  • GROUP BYtarget_column 对数据进行分组
  • HAVING condition 根据需要过滤的条件比较 column

示例:SQL HAVING

SELECT COUNT(customer_id), country
FROM Customers
GROUP BY country
HAVING COUNT(customer_id) > 1;

这里,SQL 命令:

  1. 通过按 country 分组来计算行数
  2. 如果它们的 计数 大于 1,则返回结果集。

如何在 SQL 中使用 HAVING 子句

注意: 引入 HAVING 子句是因为 WHERE 子句不支持聚合函数。此外,HAVING 子句必须在 GROUP BY 子句之后使用。要了解更多,请访问 SQL GROUP BY

SQL HAVING 与 WHERE 的区别

HAVING 子句WHERE 子句
HAVING 子句检查的是 一组行 上的条件。WHERE 子句检查的是 每个单独行 上的条件。
HAVING 用于聚合函数。WHERE 子句不能与聚合函数一起使用。
HAVING 子句在 GROUP BY 子句之后执行。WHERE 子句在 GROUP BY 子句之前执行。

让我们看一个示例,

我们可以编写 WHERE 子句来过滤 Orders 表中 amount 值小于 500 的行:

FROM Orders
WHERE amount < 500;

但使用 HAVING 子句,我们可以使用 SUM 这样的聚合函数来计算订单表中的金额总和,并获得每个客户总订单价值小于 500 的结果:

FROM Orders
GROUP BY customer_id
HAVING SUM(amount) < 500;