PostgreSQL count() Function

The PostgreSQL count() function is an aggregate function that counts and returns the number of all specified values ​​in a group.

count() Syntax

Here is the syntax of the PostgreSQL count() function:

count(expr)

Typically, we use the count() function like:

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

Parameters

expr

Required. A column name or * representing all columns.

Return value

PostgreSQL count(*) function returns the number of all rows in a group, and count(column_name) return the number of non-null values ​​in a group.

count() Examples

To demonstrate usages of the PostgreSQL count() function, we simulate a temporary table using the following statement with UNION and SELECT:

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)

Here, we have some rows about the user’s login history, with the user’s name in the name column and the date of a user’s login in the login_date column.

The login date of the last row is NULL.

To count the number of logins for each person, use the following statement:

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
------+-------------
 Tom  |           2
 Tim  |           3
(2 rows)

Here, we find that Tom has logged in 2 times, which is not correct. The reason for this result is that count(login_date) only count the number of non-null values ​​in the login_date column. To fix this error, we need to use count(*), as follows:

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)