玩转PostgreSQL(五):聚合函数AVG(), COUNT(), MIN(), MAX()

本文中,我们将学习如何使用PostgreSQL聚合函数,例如AVG(), COUNT(), MIN(), MAX(), 和SUM(),以及ARRAY_AGGSTRING_AGG.

?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):返回查询出来的不重复且不为空的列的行数。

SELECT 
   COUNT(DISTINCT column) 
FROM 
   table_name
WHERE
   condition;

我们经常使用COUNT()函数和GROUP BY子句返回每个组的项数。例如,我们可以使用COUNT()GROUP BY子句返回每个学生每门课程的分数。

?PostgreSQL COUNT() 方法示例

我们还是使用分数表,表结构如下

玩转PostgreSQL(五):聚合函数AVG(), COUNT(), MIN(), MAX()

?1) PostgreSQL COUNT(*) 示例

以下语句使用COUNT(*)函数返回score表格行数:

SELECT
   COUNT(*)
FROM
   score;

输出如下:

COUNT
--------------------
1024
 (1 row)

?2) PostgreSQL COUNT(DISTINCT column) 示例

要获得学生获得的不同成绩,我们可以使用COUNT(DISTINCT score)函数,如以下示例所示:

SELECT
    COUNT (DISTINCT score)
FROM
    score;

输出如下:

COUNT
--------------------
512
 (1 row)

?PostgreSQL COUNT()GROUP BY 子句 示例

要获得学生的课程成绩数,我们可以使用GROUP BY子句根据student_id将学生分组,并使用COUNT()函数计算每个组的付款。

以下是查询示例:

SELECT
    student_id,
    COUNT (student_id)
FROM
    score
GROUP BY
    student_id;

输出如下:

id   | count
1     | 1
2     | 1
3     | 1
...
 (512 row)

?PostgreSQL COUNT()HAVING 子句 示例

我们可以使用COUNT功能在HAVING 子句将特定条件应用于组中计数。例如,以下语句查找成绩超过5门课程的学生:

SELECT
    student_id,
    COUNT (student_id)
FROM
    score
GROUP BY
    student_id
HAVING
    COUNT (student_id) > 5;

输出如下:

id     | count
12    | 7
24    | 10
48    | 32
...
 (15 row)