九月 2, 2023
摘要:在本教程中,您将学习如何使用 PostgreSQL 的HAVING子句来指定分组或聚合的搜索条件。
目录
PostgreSQL HAVING 子句简介
HAVING子句指定分组或聚合的搜索条件。HAVING子句通常与GROUP BY子句一起使用,以根据指定条件过滤分组或聚合。
以下语句说明了HAVING子句的基本语法:
SELECT
column1,
aggregate_function (column2)
FROM
table_name
GROUP BY
column1
HAVING
condition;
在此语法中,GROUP BY子句返回按column1分组的行。HAVING子句指定过滤组的条件。
还可以添加SELECT语句的其他子句,例如JOIN、LIMIT、FETCH等。
PostgreSQL 计算HAVING子句的时间点,在FROM、WHERE、GROUP BY子句之后,在SELECT 、DISTINCT、ORDER BY和LIMIT子句之前。

由于HAVING子句在SELECT列表子句之前求值,因此不能在HAVING子句中使用列别名。因为在计算HAVING子句时,SELECT列表子句中指定的列别名还不可用。
HAVING 对比 WHERE
WHERE子句允许您根据指定条件过滤行。但是,HAVING子句允许您根据指定条件过滤行组。
换句话说,WHERE子句应用于行,而HAVING子句应用于行组。
PostgreSQL HAVING 子句示例
让我们看一下示例数据库中的payment表。

1) 使用 HAVING 子句和 SUM 函数的示例
以下查询使用带有SUM()函数的GROUP BY子句来查找每个客户的总金额:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id;

以下语句添加了HAVING 子句来查询支出超过200的客户:
SELECT
customer_id,
SUM (amount)
FROM
payment
GROUP BY
customer_id
HAVING
SUM (amount) > 200;

2) 使用 HAVING 子句和 COUNT 函数的示例
请查看示例数据库中的customer表,如下:

以下查询使用GROUP BY子句来查找每个商店的顾客数量:
SELECT
store_id,
COUNT (customer_id)
FROM
customer
GROUP BY
store_id

以下语句添加了HAVING子句来查找拥有超过 300 名顾客的商店:
SELECT
store_id,
COUNT (customer_id)
FROM
customer
GROUP BY
store_id
HAVING
COUNT (customer_id) > 300;

概括
- 使用
HAVING子句指定GROUP BY子句返回的行组或聚合的搜索条件。