所有SQL聚合函数(SUM、MAX、MIN、AVG、COUNT(列名))均忽略NULL值,但COUNT(*)统计所有行(含NULL);空字符串('')是合法非空值,被COUNT(列名)计入,而NULL与''语义、存储、查询判断及聚合行为均不同。

聚合函数不忽略空字符串,只忽略 NULL;混淆空字符串('')和 NULL 是绝大多数统计偏差的根源。
count(列名) 统计空字符串但跳过 NULL
COUNT(列名) 统计的是该列「非 NULL」的行数,而空字符串 '' 是一个合法的非空值,会被计入。例如:
SELECT COUNT(status) FROM orders;
如果 status 列包含 'pending'、''、NULL、'done',那么结果是 3('' 算一个有效值,NULL 被跳过)。
-
COUNT(*)返回4(所有行) -
COUNT(status)返回3(排除NULL,但保留'') -
SUM(CAST(LEN(status) AS INT))会把''当作长度0参与计算,而NULL仍被跳过
SUM / AVG / MAX / MIN 对空字符串的行为取决于数据类型
空字符串本身不是数值,所以当列是 VARCHAR 类型时,SUM(列名) 会直接报错(类型不匹配),不会“忽略”它——这是类型错误,不是空值处理逻辑。
- 若列定义为
INT,则不可能存入'',数据库通常拒绝插入或转成0(取决于严格模式) - 若列是
VARCHAR且你用CAST(列名 AS INT)强转,''在多数数据库中会转成0或报错,而NULL强转后仍是NULL,进而被聚合函数跳过 -
MAX(列名)在字符串列上会正常比较''和其他值(按字典序,''通常排最前),但NULL永远不参与比较
为什么警告 “聚合操作消除了空值” 从不提空字符串
SQL 标准里,“空值”特指 NULL,不是空字符串、零、空格或 FALSE。那个警告信息 警告: 聚合或其它 SET 操作消除了空值。 中的「空值」就是 NULL,它不会因你写了 '' 就触发。
- 这个警告只在聚合过程中实际丢弃了
NULL行时出现(如SUM遇到NULL) - 哪怕整列都是
'',只要没有NULL,就不会有该警告 - 想确认某列有没有
NULL:用WHERE 列名 IS NULL;想查空字符串:用WHERE 列名 = ''
真正容易被绕过的点是:业务代码里常把 '' 当作“无值”来用,但数据库不认这个约定;一旦在 GROUP BY 或 HAVING 里混用 IS NULL 和 = '',统计口径就裂开了。

















