Skip to content

PostgreSQL - COUNT 函数

在 PostgreSQL 中,COUNT() 是一个核心的聚合函数,用于计算符合指定条件的行数。它对于数据分析、报表生成和应用程序逻辑至关重要。本更新教程将探讨其各种形式和最佳实践。

为了演示 COUNT() 函数,我们使用一个现代的 employees 表。此表包含不同的数据类型和一些 NULL 值,这对于理解 COUNT 的行为方式很重要。

DROP TABLE IF EXISTS employees;
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
department VARCHAR(50),
salary NUMERIC(10, 2),
hire_date DATE NOT NULL
);
INSERT INTO employees (first_name, last_name, department, salary, hire_date) VALUES
('Alice', 'Johnson', 'Engineering', 90000.00, '2022-01-15'),
('Bob', 'Smith', 'Engineering', 95000.00, '2021-03-10'),
('Charlie', 'Brown', 'HR', 65000.00, '2023-05-20'),
('Diana', 'Prince', 'Sales', 80000.00, '2022-08-01'),
('Edward', 'King', 'Sales', 82000.00, '2022-09-11'),
('Fiona', 'Glenanne', 'HR', NULL, '2023-01-05'), -- 注意薪资为 NULL
('George', 'Costanza', 'Engineering', 105000.00, '2020-11-30');

COUNT 最常见的用法是计算表或结果集中的所有行。COUNT(*) 是实现此目的的标准且性能最佳的方式。

SELECT COUNT(*) FROM employees;

结果:

count
-------
7
(1 row)

您可以将 COUNT(*) 与 WHERE 子句结合使用,以仅计算符合特定条件的行。例如,让我们计算“工程”部门的员工数量。

SELECT COUNT(*) FROM employees WHERE department = 'Engineering';

结果:

count
-------
3
(1 row)

3. 计数非 NULL 值:COUNT(column_name)

Section titled “3. 计数非 NULL 值:COUNT(column_name)”

当您在 COUNT() 中指定列名时,它只计算该特定列具有非 NULL 值的行。这是与 COUNT(*) 的一个关键区别。让我们计算有多少员工记录了薪资。

SELECT COUNT(salary) FROM employees;

结果:(注意 Fiona Glenanne 的 NULL 薪资未被计算)

count
-------
6
(1 row)

4. 计数唯一值:COUNT(DISTINCT column_name)

Section titled “4. 计数唯一值:COUNT(DISTINCT column_name)”

要计算列中唯一、非 NULL 值的数量,请使用 DISTINCT 关键字。例如,让我们找出公司中有多少个不同的部门。

SELECT COUNT(DISTINCT department) FROM employees;

结果:

count
-------
3
(1 row)

将 COUNT() 与 GROUP BY 结合使用是一种强大且常用的模式,用于创建汇总报告。让我们计算每个部门的员工数量。

SELECT
department,
COUNT(*) AS number_of_employees
FROM
employees
GROUP BY
department
ORDER BY
number_of_employees DESC;

结果:

department | number_of_employees
-------------+-----------------------
Engineering | 3
HR | 2
Sales | 2
(3 rows)
  • 性能:COUNT(*) 通常是计算所有行最快的方式。PostgreSQL 对此操作进行了高度优化。COUNT(1) 等同于 COUNT(*),不提供任何性能优势。
  • 清晰性是关键:使用别名(例如,AS number_of_employees)可以使您的结果更具可读性,尤其是在报告和应用程序中。
  • 理解 NULL 值:最常见的错误是混淆 COUNT(*) 和 COUNT(column)。请始终记住 COUNT(column) 会忽略 NULL 值。这是一项特性,而非缺陷,对于数据质量检查非常有用。
  • 大型表:在非常大的表中计数行可能资源密集。对于估算,PostgreSQL 提供了统计近似值,这会快得多。对于精确计数,如果使用 WHERE 子句,请确保您的查询已良好索引。