IS NULL 和 IS NOT NULL 是检查空值的唯一标准写法,因 NULL 表示未知值,不参与常规比较;= NULL 永远返回 false,而空字符串、0 等均不等于 NULL,需显式补充判断。

IS NULL 和 IS NOT NULL 是唯一标准写法
SQL 中检查字段是否为空,必须用 IS NULL 或 IS NOT NULL。不能用 = NULL 或 != NULL —— 这些永远返回 UNKNOWN,结果为 false,查不到任何数据。
原因在于 SQL 的三值逻辑(true/false/unknown),NULL 表示“未知值”,不是“空字符串”也不是“零”,它不参与常规比较运算。
-
WHERE col = NULL→ 永远不匹配,即使该列全是 NULL -
WHERE col IS NULL→ 正确判断 NULL 值 -
WHERE col IS NOT NULL→ 排除 NULL,但注意:仍可能包含空字符串''或 0
空字符串、零、空白字符 ≠ NULL,要分开处理
很多人误以为 IS NULL 能捕获所有“看起来空”的数据,其实不然。以下值都不是 NULL:
- 空字符串:
'' - 全空格字符串:
' '(含空格) - 数字零:
0(对数值型字段) - 日期 '0000-00-00'(MySQL 兼容模式下)
若需一并过滤,得显式补充条件:
WHERE col IS NULL OR col = '' OR TRIM(col) = ''
注意:TRIM() 在不同数据库支持度不同(PostgreSQL/MySQL 支持,SQL Server 用 RTRIM(LTRIM()),Oracle 用 TRIM())。数值型字段加 OR col = 0 要谨慎——0 可能是合法业务值。
在 WHERE、JOIN、GROUP BY 中 NULL 的行为差异
NULL 不仅影响查询结果,还影响连接和分组逻辑:
-
JOIN ON a.id = b.id:若任一侧为 NULL,该行不会被关联上(因为NULL = NULL为 false) - 想让 NULL 匹配 NULL,得改写为:
ON (a.id = b.id) OR (a.id IS NULL AND b.id IS NULL) -
GROUP BY col:所有 NULL 值会被归为同一组(这是标准行为,多数数据库一致) -
ORDER BY col:NULL 默认排在最前(PostgreSQL)或最后(MySQL),可用ORDER BY col IS NULL, col显式控制顺序
用 COALESCE 或 CASE 预处理 NULL 更可控
直接用 IS NULL 判断适合简单过滤,但若要在 SELECT 中统一呈现“空值占位符”,推荐用 COALESCE:
SELECT COALESCE(name, '未知') AS name FROM users;
比嵌套 CASE WHEN name IS NULL THEN '未知' ELSE name END 更简洁。注意:COALESCE 返回第一个非 NULL 表达式的类型,类型不一致时可能触发隐式转换(如 COALESCE(int_col, 'N/A') 在某些数据库会报错)。
复杂逻辑(比如按 NULL / 空字符串 / 有效值分类统计)还是得靠 CASE + 多重判断,别试图用一个 IS NULL 搞定所有“空”的语义。
实际写 SQL 时,先明确业务定义的“空”到底指什么:是缺失值(NULL)、未填写('')、还是非法默认值(0/'1970-01-01')——再决定用哪个判断组合。漏掉一种,就可能埋下数据偏差的坑。

















