玩转PostgreSQL(五):聚合函数AVG(), COUNT(), MIN(), MAX()
本文中,我们将学习如何使用PostgreSQL聚合函数,例如
AVG()
,COUNT()
,MIN()
,MAX()
, 和SUM()
,以及ARRAY_AGG
和STRING_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()
方法示例
我们还是使用分数表,表结构如下
?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)