SQLPathLab
SQL 实战指南 · MySQL 8.0

NULL 与三值逻辑为什么容易出错

NULL 不是空字符串,和 NULL 比较可能得到 UNKNOWN。

问题与判断方法

SQL 条件不仅有 TRUE 和 FALSE,还可能得到 UNKNOWN。NULL 表示未知或缺失,因此 status = NULL 不会找到空值行,NOT 也不能把 UNKNOWN 自动变成 TRUE。

筛选空值使用 IS NULL 或 IS NOT NULL;展示备用值使用 COALESCE。COUNT(*)、COUNT(字段)、SUM 和 AVG 对 NULL 的处理也不同,统计前要明确分母和缺失值含义。

不要把所有 NULL 都替换成 0 或空字符串。未知金额、零金额和未填写文本往往代表不同业务状态,替代值应由业务规则决定。

示例

示例数据表

表名:customers
customers
idnickname
101 NULL
102 Bobby
103 NULL

优化前 / 不推荐

SELECT id, nickname FROM customers WHERE nickname = NULL ORDER BY id;

优化前运行结果

result
idnickname

优化后 / 推荐

SELECT id, nickname FROM customers WHERE nickname IS NULL ORDER BY id;

优化后运行结果

result
idnickname
101 NULL
103 NULL

为什么这样更好:等号比较 NULL 不会得到 TRUE;IS NULL 才会返回缺少昵称的客户。

这篇内容是否清楚?