NULL在SQL中不参与常规比较,需用IS NULL/IS NOT NULL判断;算术运算遇NULL结果为NULL,应使用COALESCE等函数兜底;IN/NOT IN对NULL返回UNKNOWN,须显式处理;聚合函数自动忽略NULL,统计时需注意偏差。

WHERE条件里用= NULL永远查不到数据
直接写 WHERE status = NULL 不会命中任何行,哪怕该列全是NULL。因为NULL不参与常规比较,结果恒为UNKNOWN,被WHERE过滤掉。
必须改用显式判断:WHERE status IS NULL 或 WHERE status IS NOT NULL。如果业务逻辑需要“status为空或不等于active”,得拆成两段:WHERE status IS NULL OR status != 'active',不能合并成 status != 'active' —— 后者自动跳过NULL行。
算术运算中遇到NULL会让整个结果变NULL
SET @sum = @sum + amount 这类累加语句,只要amount是NULL,@sum立刻变成NULL,后续所有计算都失效。
解决方法不是加IF判断,而是提前兜底:
- MySQL用
IFNULL(amount, 0) - SQL Server用
ISNULL(amount, 0) - 通用写法(跨数据库)用
COALESCE(amount, 0)
注意:COALESCE返回第一个非NULL值,参数类型要兼容;ISNULL只接受两个参数且返回值类型与第一个参数一致,效率略高但可移植性差。
存储过程里用IN/NOT IN时NULL让逻辑静默失效
IF @type IN ('A', 'B') 这种判断,当@type是NULL时,整条表达式结果为UNKNOWN,相当于false,但不会报错、也不会进ELSE分支——行为像“跳过”。容易漏掉本该处理的空值场景。
正确做法是显式覆盖NULL分支:
- 先判断
IF @type IS NULL THEN ... - 再判断
ELSEIF @type IN ('A', 'B') THEN ... - 最后补
ELSE ...
别依赖IN自动处理NULL,它根本不处理。
聚合函数里NULL导致统计偏差
COUNT(status) 会忽略所有status为NULL的行,而 COUNT(*) 统计全部行。两者差值就是NULL值数量。
如果想把NULL也纳入统计并赋予含义(比如记为'unknown'),得在SELECT里转换:
- MySQL:
SELECT COUNT(*) FROM t WHERE IFNULL(status, 'unknown') = 'unknown' - 通用写法:
SELECT COUNT(*) FROM t WHERE COALESCE(status, 'unknown') = 'unknown'
更关键的是:别在存储过程里直接对可能为NULL的字段做SUM/AVG后直接赋值给变量,务必先用COALESCE兜底,否则变量可能意外变成NULL,后续逻辑全崩。










