SQL中必须用IS NULL而非= NULL判断空值,因为NULL是“未知”标记而非值,所有= NULL比较均返回UNKNOWN,而WHERE只保留TRUE结果;IS NULL是标准真值谓词,返回确定布尔值且不受三值逻辑影响。

因为在SQL中,NULL不是值,而是“未知”或“缺失”的标记,它不参与常规比较运算。所有用= NULL、!= NULL甚至NULL = NULL的写法,结果都不是TRUE或FALSE,而是UNKNOWN。而WHERE子句只保留计算结果为TRUE的行,UNKNOWN会被直接过滤掉——所以WHERE col = NULL永远查不到任何数据,哪怕该列全是NULL。
IS NULL 是专为判空设计的谓词
IS NULL和IS NOT NULL是SQL标准定义的真值测试谓词,语义明确:只回答“这个值是否存在/是否缺失”,不尝试做相等比较。它们:
- 返回确定的布尔值(
TRUE或FALSE),不受三值逻辑干扰 - 不触发类型隐式转换,也不依赖字段类型(对
INT、VARCHAR、DATE都适用) - 不是函数,不能加括号,不能写成
IS NULL(col)或= IS NULL
常见错误写法与后果
这些写法看似合理,但实际无效:
-
WHERE email = NULL→ 永远无结果 -
WHERE name != 'Alice'→ 查不到name为NULL的记录(因为NULL != 'Alice'是UNKNOWN) -
WHERE status IN (NULL, 'pending')→ 整个条件判为UNKNOWN,查不到任何行 -
WHERE email = 'NULL'→ 在匹配字符串字面量'NULL',不是判空
NULL 和空字符串('')不是一回事
业务上常混淆二者,但数据库里它们完全不同:
-
email IS NULL表示“邮箱未提供、未知” -
email = ''表示“邮箱明确填了空字符串” - 建表时若定义
email VARCHAR(255) NOT NULL DEFAULT '',那email IS NULL永远不成立,得用email = ''来查“空内容”
其他地方也容易踩坑
记住IS NULL只解决“是否为空”这一步,后续逻辑仍需小心:
-
COUNT(email)跳过NULL行,COUNT(*)统计全部行——两者不等价 -
LEFT JOIN后用WHERE right.id IS NULL找未关联记录,前提是right.id本身是NOT NULL字段 - 连接条件
a.col = b.col在任一列为NULL时整行被丢弃;安全写法是(a.col = b.col) OR (a.col IS NULL AND b.col IS NULL)

















