PostgreSQL 教程: count 函数

九月 7, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的count()函数来计算表中的行数。

目录

PostgreSQL count 函数概述

count()函数是一个聚合函数,可让您获取与查询的特定条件匹配的行数。

以下语句说明了使用count()函数的各种方法。

count(*)

count(*)函数返回 SELECT 语句返回的行数 ,包括 NULL 和重复项。

SELECT 
   count(*) 
FROM 
   table_name
WHERE
   condition;

当您将count(*)函数应用于整个表时,PostgreSQL 必须顺序扫描整个表。

如果在大表上使用count(*)函数,查询会很慢。这与 PostgreSQL MVCC 实现有关。由于多个事务同时看到不同的数据状态,count(*)函数没有直接的方法来对整个表进行计数,因此 PostgreSQL 必须扫描所有行。

count(column)

count(*)函数类似,count(column)函数返回SELECT子句返回的行数。但是,它不考虑column中的NULL值。

SELECT 
   count(column) 
FROM 
   table_name
WHERE
   condition;

count(DISTINCT column)

在此形式中,count(DISTINCT column)返回column中唯一非空值的数量。

SELECT 
   count(DISTINCT column) 
FROM 
   table_name
WHERE
   condition;

我们经常使用带有GROUP BY子句的count()函数来返回每个组的项目数。例如,我们可以使用count()GROUP BY子句来返回每个电影类别中的电影数量。

PostgreSQL count 函数示例

我们使用示例数据库中的payment表进行演示。

img

count(*) 示例

以下语句使用count(*)函数返回payment表中的交易数:

SELECT
   count(*)
FROM
   payment;

这是输出:

postgresql count example

count(DISTINCT column) 示例

要获取客户支付的不同金额,您可以使用count(DISTINCT amount)函数,如下面示例所示:

SELECT
	count(DISTINCT amount)
FROM
	payment;

postgresql count distinct

将 count 函数和 GROUP BY 子句一起使用

要获取客户的付款次数,您可以使用 GROUP BY 子句根据客户 ID 将付款分组,并使用count()函数对每个组的付款进行计数。

以下查询说明了这个想法:

SELECT
	customer_id,
	count(customer_id)
FROM
	payment
GROUP BY
	customer_id;

这是部分输出:

postgresql count with group by

将 count 函数和 HAVING 子句一起使用

您可以在 HAVING 子句中使用count函数将特定条件应用于组。例如,以下语句查找已付款超过 40 次的客户:

SELECT
	customer_id,
	count(customer_id)
FROM
	payment
GROUP BY
	customer_id
HAVING
	count(customer_id) > 40;

postgresql count with having

在本教程中,您学习了如何使用 PostgreSQL 的count()函数返回表中的行数。

了解更多

PostgreSQL 教程:聚合函数

PostgreSQL 文档:聚集函数