1.
COUNT(*)
:统计总行数
COUNT(*)
是 SQL 中最常用的统计方式之一。它会统计查询结果集中所有行的数量(包括
NULL
值)。
语法:
SELECT COUNT(*) FROM 表名;
示例: 假设我们有一个
employees
表,包含以下数据:
idnameagedepartment1John Doe30Sales2Jane SmithNULLHR3Alice Brown25NULL
执行以下查询:
SELECT COUNT(*) FROM employees;
结果:
3
解释:
COUNT(*)
会统计所有行,不会忽略
NULL
值,即使某些列有
NULL
,它也会计算每一行。因此,结果为
3
,表示表中共有 3 行数据。
2.
COUNT(1)
:统计总行数
COUNT(1)
的作用与
COUNT(*)
类似,也会统计表中所有的行。它是 SQL 优化中的一个小技巧,某些数据库系统(如 MySQL)会对其进行优化处理。
语法:
SELECT COUNT(1) FROM 表名;
解释:
COUNT(1)
和
COUNT(*)
的结果是相同的,都会返回表中所有行的数量。数据库会将
1
替代成一个常量来参与计算,并且不会关心每一列的具体值。
优化区别: 在某些数据库系统(如 MySQL)中,
COUNT(1)
和
COUNT(*)
在执行计划中的表现可能相同,查询效率基本没有区别。然而,某些旧版的数据库系统在处理
COUNT(*)
时,会去解析整行数据,而
COUNT(1)
可以直接统计行数,因此会有一些微小的性能差异。
3.
COUNT(列名)
:统计特定列中非 NULL 值的数量
与
COUNT(*)
不同,
COUNT(列名)
只会统计指定列中非 NULL 值的数量。如果某列中有
NULL
值,
COUNT(列名)
会自动跳过它们。
语法:
SELECT COUNT(列名) FROM 表名;
示例:
SELECT COUNT(age) FROM employees;
结果
2
4.
COUNT(DISTINCT 列名)
:统计某列中不重复的非 NULL 值的数量
有时,我们不仅需要统计某列中的非 NULL 值,还需要统计不重复的值。在这种情况下,可以使用
COUNT(DISTINCT 列名)
来完成这个任务。
语法:
SELECT COUNT(DISTINCT 列名) FROM 表名;
示例: 假设我们有以下表数据:
iddepartment1Sales2HR3Sales4IT
查询:
SELECT COUNT(DISTINCT department) FROM employees;
结果:
3
解释: 表中有三个不重复的
department
值:
Sales
,
HR
,
IT
。因此,
COUNT(DISTINCT department)
返回 3,表示有 3 个不同的部门。
5.
COUNT()
与
GROUP BY
的结合
COUNT()
函数经常和
GROUP BY
子句结合使用,用于统计每个分组的数量。
GROUP BY
按照某列对数据进行分组,
COUNT()
则对每个分组内的行数进行统计。
6.
COUNT
与
HAVING
的结合
HAVING
子句通常与
GROUP BY
一起使用,用来过滤聚合结果。它可以用来限制返回的分组数量,条件可以基于
COUNT()
等聚合函数的结果。
7.
COUNT
与
JOIN
的结合
在复杂的查询中,
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)
统计每个部门中关联的员工数量。
COUNT(*)
和
COUNT(1)
的区别
区别:
- 在大多数数据库系统中,
COUNT(*)
和COUNT(1)
的性能几乎相同。COUNT(*)
会统计表中所有行,而不关心列内容,而COUNT(1)
则是将1
作为一个固定值用于统计。 - 在某些数据库系统中,
COUNT(1)
被认为稍微高效一点,因为它不需要解析所有列,只是使用常量1
来计数。
结论: 现代数据库(如 MySQL)会对
COUNT(*)
和
COUNT(1)
做优化处理,因此二者的性能差异几乎可以忽略。选择哪种方式可以根据个人习惯或项目规范。
总结
COUNT(*)
:统计表中所有行,包括NULL
值。COUNT(1)
:与COUNT(*)
类似,统计所有行。COUNT(列名)
:统计某列中非NULL
值的数量。COUNT(DISTINCT 列名)
:统计某列中不重复的非NULL
值。COUNT
可与GROUP BY
和HAVING
等子句结合,进行复杂的分组统计和条件过滤。COUNT(*)
和COUNT(1)
在大多数数据库中性能相同,可以按习惯使用。
版权归原作者 qq_62851576 所有, 如有侵权,请联系我们删除。