SQL聚合函数:SUM与COUNT的区别
在 SQL 中,SUM
、COUNT(*)
、COUNT(1)
和 COUNT(column)
都是聚合函数,但它们的作用和计算逻辑有本质区别:
1. SUM(column)
- 作用:对指定列的所有非 NULL 数值求和。
- 特性:
- 仅适用于数值类型列(如
INT
,FLOAT
等)。 - 忽略
NULL
值,仅计算有效数值。
- 仅适用于数值类型列(如
- 示例:
-- 假设表 sales 有列 amount: [100, NULL, 50] SELECT SUM(amount) FROM sales; -- 结果:150
2. COUNT(*)
- 作用:统计表中总行数(包括所有列值为
NULL
的行)。 - 特性:
- 不关心具体列内容,直接计数所有行。
- 性能通常最优(数据库引擎会优化)。
- 示例:
-- 假设表 sales 有 3 行(其中一行全为 NULL) SELECT COUNT(*) FROM sales; -- 结果:3
3. COUNT(1)
- 作用:统计表中总行数(等价于
COUNT(*)
)。 - 特性:
1
是一个常量表达式,不引用任何列。- 执行结果和性能与
COUNT(*)
完全相同(现代数据库优化后无差别)。
- 示例:
SELECT COUNT(1) FROM sales; -- 结果:3(与 COUNT(*) 一致)
✅ 为什么
COUNT(*)
和COUNT(1)
一样?
数据库引擎在处理时,二者都会被优化为直接统计行数,无需检查列值。优先推荐COUNT(*)
(语义更明确)。
4. COUNT(column)
- 作用:统计指定列中非 NULL 值的数量。
- 特性:
- 仅计数该列不为
NULL
的行。 - 如果列包含
NULL
,结果会小于COUNT(*)
。
- 仅计数该列不为
- 示例:
-- 假设表 sales 有列 product: ["A", NULL, "B"] SELECT COUNT(product) FROM sales; -- 结果:2(忽略 NULL)
⭐ 关键区别总结
函数 | 作用 | 是否忽略 NULL | 性能建议 |
---|---|---|---|
SUM(column) | 对数值列求和 | 忽略 NULL 值 | 仅用于数值列 |
COUNT(*) | 统计所有行数 | 不忽略 NULL 行 | ✅ 优先使用 |
COUNT(1) | 统计所有行数(同 COUNT(*) ) | 不忽略 NULL 行 | = COUNT(*) |
COUNT(column) | 统计列的非 NULL 值数量 | 忽略 NULL 值 | 需注意 NULL 影响 |
🚨 常见误区
-
COUNT(*)
vsCOUNT(1)
- 二者性能无差异,但
COUNT(*)
更符合语义(统计行数)。
- 二者性能无差异,但
-
COUNT(column)
可能返回比预期小的值- 如果列包含
NULL
,结果会减少,例如:-- 表中 100 行,其中 10 行 column_x 为 NULL COUNT(*) --> 100 COUNT(column_x) --> 90
- 如果列包含
-
COUNT
与字符串/日期列COUNT(column)
可用于任何数据类型(不限于数字),但仍会忽略NULL
。
💡 使用建议
- 统计总行数 →
COUNT(*)
- 统计某列有效值数量 →
COUNT(column)
(注意 NULL 影响) - 避免
COUNT(非索引列)
对大表扫描,可考虑用索引列替代优化性能。