SQL 中 AND、OR、NOT 对 NULL 值的处理逻辑详解

Evan
Evan
发布时间:2026-10-15| 6人浏览过
原创

在使用 SQL 进行数据查询时,NULL 值的处理往往是最容易引发 Bug 的地方之一。特别是在组合使用 AND、OR、NOT 等逻辑运算符时,由于 SQL 采用三值逻辑(True/False/Unknown),其表现与传统布尔逻辑有显著差异。本文将通过真值表和实际子句分析,帮你彻底理清这些隐藏的逻辑陷阱。

核心目标:掌握复合条件中的 NULL 表现

许多开发者习惯用二值逻辑(非真即假)来思考 SQL 查询,但在存在空值(NULL)的情况下,结果往往不符合直觉。理解以下逻辑有助于编写更稳健的数据检索语句。

准备条件:理解三值逻辑基础

在深入研究之前,需明确 SQL 中的逻辑运算涉及三个状态:

  • TRUE:条件成立
  • FALSE:条件不成立
  • NULL (Unknown):未知或空值

真实操作顺序:逻辑运算符的真值表解析

当查询条件中包含 NULL 时,不同的运算符组合会产生截然不同的结果。以下是标准的真值表对照:

第一步:分析 AND 运算符的行为

目的:确定何时条件会被判定为 False 或保持 Unknown。

关键结论:只要参与 AND 运算的项中有一方为 FALSE,结果必为 FALSE;如果双方均为 TRUE,结果为 TRUE;若其中一方为 NULL 而另一方为 TRUE,结果则为 NULL。这意味着 AND 无法“激活”一个未知的条件。

第二步:分析 OR 运算符的行为

目的:确定何时条件能被满足,以及何时会陷入未知。

关键结论:只要参与 OR 运算的项中有一方为 TRUE,结果即为 TRUE(无论其他项是什么)。仅当所有项均为 FALSE 或包含 NULL 且无 TRUE 时,结果才可能为 NULL 或 FALSE。特别注意:若存在 NULL 而无 TRUE,结果往往是 NULL 而非 FALSE,这可能导致期望被过滤的行被意外保留或丢弃。

第三步:分析 NOT 运算符的行为

目的:了解取反对未知状态的影响。

关键结论:NOT TRUE 等于 FALSE,NOT FALSE 等于 TRUE,但 NOT NULL 依然等于 NULL。因此,使用 WHERE col != 'value' 无法排除 NULL 值,因为 NULL 不等于任何具体值,其结果仍为 Unknown,导致该行不被返回(除非使用 IS NULL)。

第四步:理解运算符优先级与括号的使用

入口:编写复杂 WHERE 子句。

动作:遵循 NOT > AND > OR 的优先级规则。

重要参数:为了避免歧义并确保代码在不同数据库系统中的可移植性,强烈建议使用圆括号 () 显式指定运算顺序。例如:(A = 1 AND B = 2) OR C = 3。

完成判断:特定子句在 NULL 下的表现

第五步:排查 BETWEEN 子句的空值影响

原理:A BETWEEN B AND C 等价于 (A >= B) AND (A <= C)。

结果:根据 AND 的真值表,如果 A 为 NULL,则整个表达式的结果必为 NULL。这意味着使用 BETWEEN 筛选范围时,如果字段值为 NULL,该行记录将被自动排除(不会返回结果)。

第六步:排查 IN 子句的空值影响

原理:A IN (B, C, D) 等价于 (A=B) OR (A=C) OR (A=D)。

结果:同理,如果 A 为 NULL,那么每个比较表达式都返回 NULL 或 FALSE。最终由 OR 组合后,只要没有一个是 TRUE,结果就不会是 TRUE。具体而言,若列表中不含匹配项,且 A 为 NULL,整体结果为 NULL,同样会导致记录被过滤。

注意:以上两个子句并没有增加 SQL 的表达能力,它们只是语法糖,底层逻辑完全受基础真值表约束。

第七步:执行正确的 NULL 测试

行动:不要使用 = NULL 或 <> NULL。

正确写法:必须使用 IS NULL 或 IS NOT NULL。

示例:

-- 正确查找空值
SELECT * FROM table WHERE column_name IS NULL;

-- 错误用法(永远返回空集)
SELECT * FROM table WHERE column_name = NULL;

原文有依据的排错与建议

如果你发现查询结果中缺失了部分预期数据,请优先检查涉及的字段是否包含 NULL 值。特别是当你使用 WHERE x = y AND z = w 这种结构时,若其中一个字段为 NULL,整行将被跳过。此时应结合 COALESCE(column, default_value) 函数或专门的 IS NULL 检查来处理空值逻辑。

简要总结

SQL 的三值逻辑是其灵活性的来源,也是新手最大的困惑点。记住:AND 遇 null 变 unknown,OR 遇 true 即 true,NOT null 仍为 unknown。处理此类问题时,显式使用括号理清优先级,并利用 IS [NOT] NULL 进行测试,是保证查询准确性的最佳实践。

以上就是 SQL 中 AND、OR、NOT 对 NULL 值处理的详细内容,更多关于 SQL 高级查询技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。