0

0

SQL 查询中 NULL 为什么这么“反直觉”?

舞姬之光

舞姬之光

发布时间:2026-01-19 19:47:02

|

317人浏览过

|

来源于php中文网

原创

NULL是SQL中表示缺失值的特殊标记,不参与常规比较与运算,需用IS NULL判断;三值逻辑使WHERE等子句忽略UNKNOWN结果;聚合函数自动忽略NULL,JOIN和IN子查询中NULL易导致数据静默丢失。

sql 查询中 null 为什么这么“反直觉”?

因为 NULL 在 SQL 里不是值,而是“缺失值”的标记——它不参与常规的逻辑比较、算术运算或聚合行为,所有基于“相等”“大小”“真假”的直觉判断都会失效。

NULL 不等于任何东西,包括它自己

SQL 中 NULL = NULL 返回的是 UNKNOWN(既不是 TRUE 也不是 FALSE),所以 WHERE col = NULL 永远查不到 NULL 数据。必须用 IS NULLIS NOT NULL 来判断。

  • SELECT * FROM users WHERE age = NULL; → 查不到 age 是 NULL 的行
  • SELECT * FROM users WHERE age IS NULL; → 正确写法
  • 同理,age != 18 会自动过滤掉 age 为 NULL 的行(因为 NULL != 18 是 UNKNOWN,不满足 WHERE 条件)

NULL 让布尔逻辑变成三值逻辑(TRUE/FALSE/UNKNOWN)

WHERE、HAVING、CHECK 约束只接受 TRUE 的行,FALSE 和 UNKNOWN 都被当作“不满足”。这导致很多看似合理的条件意外失效:

文心快码
文心快码

文心快码(Comate)是百度推出的一款AI辅助编程工具

下载
  • WHERE status = 'active' OR status != 'active':status 为 NULL 的行不会被选中(因为两部分都是 UNKNOWN)
  • WHERE NOT (status = 'inactive'):同样跳过 NULL 行(NOT UNKNOWN 还是 UNKNOWN)
  • 想包含 NULL?得显式写成 status = 'active' OR status IS NULL

聚合函数和运算符对 NULL “视而不见”,但容易误读结果

COUNT(*) 统计所有行,COUNT(col) 只统计 col 非 NULL 的行;SUM、AVG、MAX/MIN 自动忽略 NULL —— 看似合理,但可能掩盖数据质量问题:

  • AVG(salary) 是所有非 NULL salary 的平均值,不是“全体员工的平均薪资”(除非你确认没漏填)
  • SUM(price) * quantity:只要 price 或 quantity 任一为 NULL,整个表达式就是 NULL(不是 0!)
  • COALESCE(price, 0)NULLIF() 主动处理,别依赖默认行为

JOIN 和子查询中 NULL 容易引发“静默丢失”

ON 条件中涉及 NULL 的等值匹配(如 t1.id = t2.ref_id)永远失败,导致左表 NULL 外键对应行在 LEFT JOIN 中右表列为 NULL,但若后续加了 WHERE t2.status = 'ok',整行就彻底消失(因为 t2.status 是 NULL,条件为 UNKNOWN)。

  • LEFT JOIN 后想保留左表全部行?WHERE 子句里别对右表字段做非 NULL 判断
  • 子查询中 IN (SELECT col FROM t):如果子查询结果含 NULL,整个 IN 表达式返回 UNKNOWN,常导致意外空结果
  • 安全写法:col IN (SELECT col FROM t WHERE col IS NOT NULL) 或改用 EXISTS

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

321

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

676

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

417

2024.04.29

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 12.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

NumPy 教程
NumPy 教程

共44课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号