1. count(*)
-
功能:统计所有记录的数量,无论字段是否为
NULL。 -
特点:
- 不考虑字段值,只计算行数。
- 通常是性能最优的计数方式,因为无需检查字段值。
2. count(1)
-
功能:在每行插入一个常量值
1,然后统计这些值的数量。 -
特点:
- 与
count(*)的结果相同(行数),但实现逻辑略有不同。 - 在某些数据库(如 MySQL)中,
count(1)可能比count(*)稍快,但在 SQL Server 中两者性能接近。
- 与
3. count (字段)
-
功能:统计指定字段非 NULL 值的数量。
-
特点:
- 只计算字段值不为
NULL的记录。 - 如果字段允许
NULL,结果可能小于count(*)。 - 如果字段被定义为
NOT NULL,则结果与count(*)相同。
- 只计算字段值不为
性能差异
- count(*)
vscount(1) :在 SQL Server 中,两者性能几乎无差异,优化器通常会将它们视为相同操作。 - count (字段) :如果字段允许
NULL,SQL Server 需要过滤NULL值,可能导致额外开销。
示例对比
假设有表Users:
ID | Name | Age
-------------------
1 | Alice | 30
2 | Bob | NULL
3 | NULL | 25
SELECT COUNT(*)→ 3(所有行)SELECT COUNT(1)→ 3(所有行)SELECT COUNT(Name)→ 2(Name列有 2 个非 NULL 值)SELECT COUNT(Age)→ 2(Age列有 2 个非 NULL 值)
适用场景
- 统计总行数:推荐使用
count(*),语法清晰且性能稳定。 - 统计非 NULL 值:使用
count(字段)。
总结
| 方式 | 统计范围 | NULL 处理 | 性能建议 |
|---|---|---|---|
count(*) | 所有行 | 包含所有记录 | 总行数首选 |
count(1) | 所有行 | 包含所有记录 | 与count(*)等效 |
count(字段) | 字段非 NULL 值 | 忽略字段为 NULL 的记录 | 统计非NULL值的数量 |