PostgreSQL count() 函数使用指南

PostgreSQL count() 函数是一个聚合函数,它统计一个分组中的所有指定的值的数量并返回。

count() 语法

这里是 PostgreSQL count() 的语法:

count(expr)

我们通常在 SQLite 中按如下方式使用 count() 函数:

SELECT count(expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];

参数

expr
必需的。一个要统计数量的的列名或者表达式,或者 * 表示所有的列。

返回值

PostgreSQL count(*) 函数返回一个分组中的所有行的数量,count(column_name) 函数返回一个分组中的非 null 值的数量。

count() 示例

为了演示 PostgreSQL count() 的用法,我们使用以下 UNIONSELECT 语句模拟一个表:

SELECT 'Tim' name, '20220726' login_date
UNION
SELECT 'Tim' name, '20220725' login_date
UNION
SELECT 'Tim' name, '20220724' login_date
UNION
SELECT 'Tom' name, '20220725' login_date
UNION
SELECT 'Tom' name, '20220723' login_date
UNION
SELECT 'Tom' name, NULL login_date;
 name | login_date
------+------------
 Tim  | 20220726
 Tom  | 20220725
 Tim  | 20220724
 Tim  | 20220725
 Tom  | 20220723
 Tom  | <null>
(6 rows)

这里,我们拥有了关于用户登录历史的一些行,其中, name 列中是用户的名称,login_date 列中是用户的一次登录的日期。

最后一行的登录日期为 NULL

要统计每个人的登录次数,请使用以下语句:

SELECT
    t.name,
    count(login_date) login_times
FROM (
    SELECT 'Tim' name, '20220726' login_date
    UNION
    SELECT 'Tim' name, '20220725' login_date
    UNION
    SELECT 'Tim' name, '20220724' login_date
    UNION
    SELECT 'Tom' name, '20220725' login_date
    UNION
    SELECT 'Tom' name, '20220723' login_date
    UNION
    SELECT 'Tom' name, NULL login_date
) t
GROUP BY t.name;
name  login_times
----  -----------
Tim   3
Tom   2

这里,我们发现,用户 Tom 的登录次数是 2 次,这并不正确。 产生这个结果的原因是 count(login_date) 只统计了 login_date 列中非 null 值的数量。为了纠正这个错误,我们需要使用 count(*),如下:

SELECT
    t.name,
    count(*) login_times
FROM (
    SELECT 'Tim' name, '20220726' login_date
    UNION
    SELECT 'Tim' name, '20220725' login_date
    UNION
    SELECT 'Tim' name, '20220724' login_date
    UNION
    SELECT 'Tom' name, '20220725' login_date
    UNION
    SELECT 'Tom' name, '20220723' login_date
    UNION
    SELECT 'Tom' name, NULL login_date
) t
GROUP BY t.name;
 name | login_times
------+-------------
 Tom  |           3
 Tim  |           3
(2 rows)