MySQL中NULL表示“值未知”,WHERE中= NULL查不到数据,因其返回UNKNOWN而非TRUE;必须用IS NULL/IS NOT NULL判断;计算遇NULL结果为NULL,需用IFNULL()或COALESCE()兜底。

MySQL 中的 NULL 不是“空”或“零”,而是“值未知”——所有误用都源于把它当成普通值来比较或计算。
WHERE 条件里写 = NULL 为什么查不到数据?
因为 = NULL 的结果既不是 TRUE 也不是 FALSE,而是 SQL 三值逻辑里的 UNKNOWN,而 WHERE 只接受 TRUE 的行。所以这句永远不匹配:
SELECT * FROM users WHERE email = NULL;
正确写法只有两个:
-
WHERE email IS NULL—— 查明确缺失的记录 -
WHERE email IS NOT NULL—— 查有值的记录
注意:!= NULL、<> NULL、> NULL 全部无效,原理相同。
COALESCE() 和 IFNULL() 怎么选?
两者都用来兜底 NULL,但参数规则和兼容性不同:
-
IFNULL(expr1, expr2)是 MySQL 特有,只支持两个参数;如果expr1为 NULL,返回expr2,否则返回expr1 -
COALESCE(expr1, expr2, ..., exprN)是 SQL 标准函数,返回第一个非 NULL 的表达式;支持任意多个参数,移植性更好
示例:
SELECT IFNULL(price, 0) FROM products;
SELECT COALESCE(discount_price, regular_price, 0) FROM products;
如果字段可能为 NULL 且后续要参与加减运算,不用这两个函数,结果就是 NULL —— 比如 salary + bonus,只要其中一个是 NULL,整列全为 NULL。
运算符能替代 IS NULL 吗?
可以,但不推荐在 WHERE 中滥用。它叫“安全等于”,特点是:
-
NULL NULL返回 1(TRUE) -
'abc' NULL返回 0(FALSE) -
5 5返回 1
所以 WHERE commission NULL 等价于 WHERE commission IS NULL,但它的主要价值不在这里,而在动态拼接条件或变量比较时避免判空分支。例如存储过程中做参数校验:
IF input_value <=> target_value THEN ... END IF;
此时不用先判断是否为 NULL 再分支,一行搞定。但在常规查询中,仍建议坚持用 IS NULL,语义更清晰,也利于索引识别。
聚合函数里 NULL 会怎样?
绝大多数聚合函数(COUNT()、SUM()、AVG()、MAX()、MIN())默认忽略 NULL 值:
-
COUNT(*)统计所有行(含 NULL) -
COUNT(column)只统计该列非 NULL 的行数 -
SUM(age)只对非 NULL 的age求和,遇到 NULL 直接跳过
这意味着:如果你用 AVG() 算平均年龄,而表里有 10 行,其中 3 行 age IS NULL,那分母是 7,不是 10。这点容易被忽略,尤其在报表口径不一致时。


















