COUNT(col)只统计col列非NULL值的行数,空字符串、0、false等均被计数;COUNT(*)统计所有行,含NULL行;二者结果差值即为col列NULL值数量。

COUNT(col) 会忽略该列中所有 NULL 值 的行。
只统计非 NULL 的值
与 COUNT(*) 不同,COUNT(col) 不统计整行,而是只检查指定列(col)的值。只要 col 的值是 NULL,这一行就不会被计入结果。
- 空字符串('')、数字 0、布尔 false、时间 0000-00-00 等,都不是 NULL,会被正常计数
- 显式插入 NULL、未赋值字段、计算结果为 NULL(如 1/0、CONCAT('a', NULL))都会被跳过
常见易混淆情况
很多人误以为空字符串或 0 是“空”,其实它们是有效值:
- SELECT COUNT(name) FROM users; —— name 为 '' 或 '0' 都算 1 次;只有 name IS NULL 才不计
- SELECT COUNT(age) FROM users; —— age = 0 会被计,age IS NULL 才不计
想统计含 NULL 的行数?用 COUNT(*)
如果目标是知道表里有多少行(不管列是否为空),应该用 COUNT(*):
- COUNT(*) 统计所有行,包括某列是 NULL 的行
- COUNT(col) 和 COUNT(*) 结果不同,说明 col 列存在 NULL 值
确认是否有 NULL 值的方法
快速验证某列是否含 NULL:
- SELECT COUNT(*), COUNT(col), COUNT(*) - COUNT(col) AS null_count FROM table;
- 差值大于 0,说明该列有 NULL










