where中!=对null永远返回null而非false,因sql采用三值逻辑;只有is null/is not null才能正确筛选null值,=或!=无法比较null。

WHERE中!=对NULL永远返回NULL,不是FALSE
因为!=(等价于)是标准SQL比较运算符,它遵循三值逻辑:当任意操作数为NULL时,结果既不是TRUE也不是FALSE,而是NULL。而WHERE子句只保留计算结果为TRUE的行,NULL被直接过滤掉。
常见错误现象:
-
SELECT * FROM users WHERE email != 'test@example.com';—— 不会包含email IS NULL的记录 -
SELECT * FROM users WHERE status != NULL;—— 永远返回空结果集(哪怕表里全是NULL)
IS NULL和IS NOT NULL才是查NULL的正确方式
这两个是专门设计用于判断NULL的谓词,语义明确、行为确定,且能走索引(只要列上有合适索引)。
使用场景:
- 查字段确实为
NULL:WHERE column_name IS NULL - 查字段非
NULL(含所有非空值):WHERE column_name IS NOT NULL - 组合条件时避免漏数据:
WHERE (status = 'active') OR (status IS NULL),不能写成status != 'inactive'
(NULL安全等于)适合需要“相等语义但容忍NULL”的场景
不是用来“查NULL”,而是让比较在两边都为NULL时返回TRUE,适用于去重、联表匹配等需要稳定布尔结果的地方。
参数差异与性能影响:
-
a b:若a和b同为NULL,返回1;若一者为NULL另一者非NULL,返回0;否则行为同= - 它不能替代
IS NULL——比如column NULL虽能工作,但可读性差、意图模糊,且部分ORM或旧版驱动可能不识别 - 执行计划中,
通常无法利用索引做范围扫描,仅支持等值查找(和=一样)
容易忽略的关键点:NULL不是值,是“缺失标记”
很多开发者下意识把NULL当成一个特殊值来“比较”,这是根本误区。MySQL中NULL = NULL返回NULL,不是TRUE;NULL != 'abc'也返回NULL,不是TRUE。真正该问的不是“它是不是等于X”,而是“它是否存在/已知”。
所以,别试图用!=“排除NULL”,也别用= NULL“找NULL”——它们从语义上就不成立。用IS NULL或IS NOT NULL,就是最直接、最可靠、最符合SQL标准的做法。











