PostgreSQL 教程: HAVING

九月 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语句的其他子句,例如JOINLIMITFETCH等。

PostgreSQL 计算HAVING子句的时间点,在FROMWHEREGROUP BY子句之后,在SELECTDISTINCTORDER BYLIMIT子句之前。

img

由于HAVING子句在SELECT列表子句之前求值,因此不能在HAVING子句中使用列别名。因为在计算HAVING子句时,SELECT列表子句中指定的列别名还不可用。

HAVING 对比 WHERE

WHERE子句允许您根据指定条件过滤行。但是,HAVING子句允许您根据指定条件过滤行组。

换句话说,WHERE子句应用于行,而HAVING子句应用于行组。

PostgreSQL HAVING 子句示例

让我们看一下示例数据库中的payment表。

payment table

1) 使用 HAVING 子句和 SUM 函数的示例

以下查询使用带有SUM()函数的GROUP BY子句来查找每个客户的总金额:

SELECT
	customer_id,
	SUM (amount)
FROM
	payment
GROUP BY
	customer_id;

PostgreSQL HAVING - COUNT

以下语句添加了HAVING 子句来查询支出超过200的客户:

SELECT
	customer_id,
	SUM (amount)
FROM
	payment
GROUP BY
	customer_id
HAVING
	SUM (amount) > 200;

PostgreSQL HAVING - COUNT example

2) 使用 HAVING 子句和 COUNT 函数的示例

请查看示例数据库中的customer表,如下:

customer table

以下查询使用GROUP BY子句来查找每个商店的顾客数量:

SELECT
	store_id,
	COUNT (customer_id)
FROM
	customer
GROUP BY
	store_id

PostgreSQL HAVING - SUM

以下语句添加了HAVING子句来查找拥有超过 300 名顾客的商店:

SELECT
	store_id,
	COUNT (customer_id)
FROM
	customer
GROUP BY
	store_id
HAVING
	COUNT (customer_id) > 300;

img

概括

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