PostgreSQL - COUNT 函数
PostgreSQL - COUNT 函数
Section titled “PostgreSQL - COUNT 函数”在 PostgreSQL 中,COUNT() 是一个核心的聚合函数,用于计算符合指定条件的行数。它对于数据分析、报表生成和应用程序逻辑至关重要。本更新教程将探讨其各种形式和最佳实践。
设置:创建示例表
Section titled “设置:创建示例表”为了演示 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() 的核心用法
Section titled “COUNT() 的核心用法”1. 计数所有行:COUNT(*)
Section titled “1. 计数所有行:COUNT(*)”COUNT 最常见的用法是计算表或结果集中的所有行。COUNT(*) 是实现此目的的标准且性能最佳的方式。
SELECT COUNT(*) FROM employees;结果:
count------- 7(1 row)2. 带条件的行计数
Section titled “2. 带条件的行计数”您可以将 COUNT(*) 与 WHERE 子句结合使用,以仅计算符合特定条件的行。例如,让我们计算“工程”部门的员工数量。
SELECT COUNT(*) FROM employees WHERE department = 'Engineering';结果:
count------- 3(1 row)COUNT 的高级技巧
Section titled “COUNT 的高级技巧”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)5. 分组计数:COUNT 和 GROUP BY
Section titled “5. 分组计数:COUNT 和 GROUP BY”将 COUNT() 与 GROUP BY 结合使用是一种强大且常用的模式,用于创建汇总报告。让我们计算每个部门的员工数量。
SELECT department, COUNT(*) AS number_of_employeesFROM employeesGROUP BY departmentORDER BY number_of_employees DESC;结果:
department | number_of_employees-------------+----------------------- Engineering | 3 HR | 2 Sales | 2(3 rows)最佳实践与常见误区
Section titled “最佳实践与常见误区”- 性能:
COUNT(*)通常是计算所有行最快的方式。PostgreSQL 对此操作进行了高度优化。COUNT(1)等同于COUNT(*),不提供任何性能优势。 - 清晰性是关键:使用别名(例如,
AS number_of_employees)可以使您的结果更具可读性,尤其是在报告和应用程序中。 - 理解 NULL 值:最常见的错误是混淆
COUNT(*)和COUNT(column)。请始终记住COUNT(column)会忽略NULL值。这是一项特性,而非缺陷,对于数据质量检查非常有用。 - 大型表:在非常大的表中计数行可能资源密集。对于估算,PostgreSQL 提供了统计近似值,这会快得多。对于精确计数,如果使用
WHERE子句,请确保您的查询已良好索引。