COUNT(*) 是 SQL 中最常用的统计方式之一。它会统计查询结果集中所有行的数量(包括 NULL 值)。
语法:
- SELECT COUNT(*) FROM 表名;
-
示例: 假设我们有一个 employees 表,包含以下数据:
id | name | age | department |
---|---|---|---|
1 | John Doe | 30 | Sales |
2 | Jane Smith | NULL | HR |
3 | Alice Brown | 25 | NULL |
执行以下查询:
- SELECT COUNT(*) FROM employees;
-
结果:
- 3
-
解释: COUNT(*) 会统计所有行,不会忽略 NULL 值,即使某些列有 NULL,它也会计算每一行。因此,结果为 3,表示表中共有 3 行数据。
COUNT(1) 的作用与 COUNT(*) 类似,也会统计表中所有的行。它是 SQL 优化中的一个小技巧,某些数据库系统(如 MySQL)会对其进行优化处理。
语法:
- SELECT COUNT(1) FROM 表名;
-
解释: COUNT(1) 和 COUNT(*) 的结果是相同的,都会返回表中所有行的数量。数据库会将 1 替代成一个常量来参与计算,并且不会关心每一列的具体值。
优化区别: 在某些数据库系统(如 MySQL)中,COUNT(1) 和 COUNT(*) 在执行计划中的表现可能相同,查询效率基本没有区别。然而,某些旧版的数据库系统在处理 COUNT(*) 时,会去解析整行数据,而 COUNT(1) 可以直接统计行数,因此会有一些微小的性能差异。
与 COUNT(*) 不同,COUNT(列名) 只会统计指定列中非 NULL 值的数量。如果某列中有 NULL 值,COUNT(列名) 会自动跳过它们。
语法:
- SELECT COUNT(列名) FROM 表名;
示例:
- SELECT COUNT(age) FROM employees;
结果
- 2
有时,我们不仅需要统计某列中的非 NULL 值,还需要统计不重复的值。在这种情况下,可以使用 COUNT(DISTINCT 列名) 来完成这个任务。
语法:
- SELECT COUNT(DISTINCT 列名) FROM 表名;
示例: 假设我们有以下表数据:
id | department |
---|---|
1 | Sales |
2 | HR |
3 | Sales |
4 | IT |
查询:
- SELECT COUNT(DISTINCT department) FROM employees;
结果:
- 3
解释: 表中有三个不重复的 department 值:Sales, HR, IT。因此,COUNT(DISTINCT department) 返回 3,表示有 3 个不同的部门。
COUNT() 函数经常和 GROUP BY 子句结合使用,用于统计每个分组的数量。GROUP BY 按照某列对数据进行分组,COUNT() 则对每个分组内的行数进行统计。
HAVING 子句通常与 GROUP BY 一起使用,用来过滤聚合结果。它可以用来限制返回的分组数量,条件可以基于 COUNT() 等聚合函数的结果。
在复杂的查询中,COUNT() 函数可以与 JOIN 子句一起使用,统计与另一个表匹配的记录数量。
示例:
- SELECT d.department, COUNT(e.id)
- FROM departments d
- LEFT JOIN employees e ON d.id = e.department_id
- GROUP BY d.department;
-
解释: 此查询会返回每个部门中员工的数量,即使某些部门没有员工,也会返回该部门的记录(因为使用了 LEFT JOIN)。使用 COUNT(e.id) 统计每个部门中关联的员工数量。
区别:
结论: 现代数据库(如 MySQL)会对 COUNT(*) 和 COUNT(1) 做优化处理,因此二者的性能差异几乎可以忽略。选择哪种方式可以根据个人习惯或项目规范。