SQL 中 NULL 有哪些容易踩的坑?
NULL三值逻辑
考察意图
细节题,却能区分「写过生产 SQL」的人。
回答框架
- 三值逻辑:TRUE/FALSE/UNKNOWN。
- 比较与 NOT IN 陷阱。
- 聚合对 NULL 的默认行为。
- 用 COALESCE/IS NULL 显式处理。
参考答案(口述版)
NULL 表示「未知」,不是 0 也不是空字符串。
关键坑:
1. = NULL 永远不是 TRUE,应写 IS NULL
2. NOT IN (1,2,NULL) 结果恒为未知,过滤会「吞掉」行
3. 聚合:SUM/AVG 忽略 NULL;COUNT(col) 不计 NULL,COUNT(*) 计行
4. 拼接与运算传播 NULL:需要 COALESCE/IFNULL
5. JOIN 条件里 NULL 匹配不到
实践:入库尽量明确默认值或保留 NULL 但在消费层显式处理;对外部输入做空值率 DQ。
关键词
IS NULLNOT INCOUNTCOALESCE
面试官可能的追问
追问 1:COUNT(*) 和 COUNT(col) 区别?
COUNT(*) 计所有行;COUNT(col) 只计该列非 NULL 行。常用二者差值估空值数。
常见踩坑
- 用 NOT IN 子查询且子查询含 NULL
- 把 NULL 当 0 参与平均,导致口径错
记忆锚点
NULL 是未知;比较用 IS NULL,小心 NOT IN 与聚合默认行为。