面试官常问:NULL 对聚合函数的影响
在 SQL 面试中,聚合函数是必考点,而很多人忽略了 NULL 值的特殊处理逻辑。几乎所有面试官都会问:
在使用 COUNT、SUM、AVG、MAX、MIN 等聚合函数时,NULL 会不会参与计算?
如果答不出来,就会被认为对数据库的细节不够熟悉。今天我们就来系统梳理一下。
一、COUNT 和 NULL
COUNT(*) 与 COUNT(列名) 的区别正是面试高频陷阱。
-- 建表 & 插入测试数据
CREATE TABLE scores (
id INT,
grade INT
);
INSERT INTO scores VALUES
(1, 90),
(2, NULL),
(3, 80),
(4, NULL);
示例 1:COUNT(*)
SELECT COUNT(*) FROM scores;
输出结果:4
解释:COUNT(*) 会统计所有行,不管列是否为 NULL。
示例 2:COUNT(列名)
SELECT COUNT(grade) FROM scores;
输出结果:2
解释:COUNT(列名) 只统计非 NULL 的值,NULL 不会计入。
二、SUM 和 NULL
SUM 会忽略 NULL 值,只对非 NULL 记录求和。
SELECT SUM(grade) FROM scores;
结果:170
解释:只计算了 90 + 80,两个 NULL 被忽略。
如果全是 NULL,则结果为 NULL,而不是 0。
三、AVG 和 NULL
AVG 的计算过程等价于 SUM / COUNT(列名),所以 NULL 同样会被忽略。
SELECT AVG(grade) FROM scores;
结果:85
解释:(90 + 80) / 2 = 85,分母是非 NULL 的数量。
注意:如果你错误地以为分母是总行数,就会算成 170 / 4 = 42.5,这是常见面试陷阱。
四、MAX / MIN 和 NULL
MAX 和 MIN 也会忽略 NULL,只在非 NULL 值中找最大最小。
SELECT MAX(grade), MIN(grade) FROM scores;
结果:90, 80
解释:NULL 不参与比较,直接被跳过。
五、面试高频问法
面试官常会抛出以下问题:
1. COUNT(*) 和 COUNT(列名) 的区别?
COUNT(*) 包含 NULL 行,COUNT(列名) 忽略 NULL。
2. SUM、AVG 遇到 NULL 怎么算?
忽略 NULL,仅计算非 NULL 值。
3. 如果全是 NULL,SUM 和 AVG 返回多少?
SUM 返回 NULL,AVG 返回 NULL。
六、总结
COUNT(*):统计所有行,包括 NULL。
COUNT(列):只统计非 NULL 值。
SUM / AVG / MAX / MIN:忽略 NULL,只作用于有效值。
全是 NULL 的情况:大部分聚合函数返回 NULL,而不是 0。
面试官考察的重点不只是记忆,而是你能否通过逻辑来解释结果。