为什么 SQL 中 NULL 不能用 = 比较:三值逻辑与查询陷阱

为什么 SQL 中 NULL 不能用 = 比较:三值逻辑与查询陷阱

副标题 / 摘要#在 SQL 中,NULL 代表“未知”,因此 = 比较不会返回 true。本文解释三值逻辑的机制,并给出正确写法。

目标读者#经常写 SQL 的后端工程师在查询结果上踩过 NULL 坑的开发者需要制定查询规范的团队背景 / 动机#很多人会写:

SELECT * FROM t WHERE field = NULL;

然后发现它“不起作用”。原因是 SQL 使用三值逻辑,NULL 不等于任何值(包括 NULL 本身)。

核心概念#NULL 表示未知,不是空字符串或 0三值逻辑:true / false / unknown正确判断方式:IS NULL / IS NOT NULL实践指南 / 步骤#判断 NULL 用 IS NULL不要用 = 与 NULL 比较需要替代值时用 COALESCE对外部输入做明确转换可运行示例#SELECT id FROM users WHERE deleted_at IS NULL;

使用替代值:

SELECT COALESCE(age, 0) FROM users;

解释与原理#NULL = NULL 的结果是 unknown,而不是 true。SQL 的 WHERE 只保留 true 的行,unknown 会被过滤掉,因此查询为空。

常见问题与注意事项#NULL 和空字符串是一样吗?不是,空字符串是确定值。

NULL 参与计算会怎样?结果通常是 NULL(unknown)。

可以用 IS DISTINCT FROM 吗?部分数据库支持,它能正确处理 NULL。

最佳实践与建议#团队统一 NULL 处理规范查询中显式处理 NULL在数据模型中明确“缺失 vs 空值”小结 / 结论#NULL 代表未知,因此不能用 = 比较。理解三值逻辑可以避免大量隐性 bug。

参考与延伸阅读#SQL 标准三值逻辑PostgreSQL IS DISTINCT FROM元信息#阅读时长:6~8 分钟标签:SQL、NULL、查询陷阱SEO 关键词:SQL NULL, IS NULL, 三值逻辑元描述:解释为什么 SQL 中 NULL 不能用 = 比较,并给出正确写法。行动号召(CTA)#检查一次项目里的 SQL,看看有没有 = NULL 这种潜在 bug。