解析 SQL 中的 NULL 与比较操作:NULL 值与任何值的比较会返回 UNKNOWN

在 SQL 查询中,我们经常会遇到 NULL 值。NULL 值的行为与其他数据类型的值是不同的,尤其是在进行条件比较时。NULL 与其他值的比较结果是什么?

1. NULL 的特殊性:三值逻辑

首先,我们需要理解 SQL 中的三值逻辑(Three-Valued Logic)。与传统的布尔逻辑不同,SQL 处理 NULL 值时引入了一个额外的 "未知" 状态。SQL 中的三值逻辑有三种可能的结果:

  • TRUE(真)
  • FALSE(假)
  • UNKNOWN(未知)

这三种结果在 SQL 查询的执行中会产生不同的行为,尤其是在 WHERE 子句中的条件判断时。如果一个表达式的结果为 UNKNOWN,该行数据将被视为"不符合条件",因此不会被选中。

2. NULL 与其他值比较时的行为

我们以这个例子来分析一下:

sql 复制代码
appCode IS NULL AND appCode != 'app_yyy'

这个条件看起来好像是在做一个简单的 NULL 检查和不等于 'app_yyy' 的判断。但是在 SQL 中,NULL 的比较并不是简单的。具体来说:

  • appCode IS NULL 用来检查 appCode 是否为 NULL,如果是 NULL,结果为 TRUE,否则为 FALSE
  • appCode != 'app_yyy' 用来判断 appCode 是否不等于 'app_yyy'。但是在 SQL 中,任何与 NULL 进行的比较都会返回 UNKNOWN,因为 NULL 代表的是"未知"的状态。换句话说,NULL != 'app_yyy' 的结果是 UNKNOWN,而不是 TRUEFALSE

3. SQL 中的 NULL 比较规则

SQL 的比较规则如下:

  • NULL 与任何非 NULL 值进行比较(例如 NULL = 'some_value'NULL != 'some_value')结果是 UNKNOWN
  • NULLNULL 的比较(例如 NULL = NULL)也返回 UNKNOWN,而不是 TRUE
  • 只有明确使用 IS NULLIS NOT NULL 来检查 NULL

所以,回到例子,appCode IS NULL 结果为 TRUE 时,appCode != 'app_yyy' 的结果是 UNKNOWN,这会使得整个条件变成 TRUE AND UNKNOWN。由于 AND 操作符中,TRUE AND UNKNOWN 的结果是 UNKNOWN,因此该行记录不会被选中。

相关推荐
农村小镇哥7 小时前
C#读取CSV文件的方法
服务器·数据库·c#
IMPYLH7 小时前
HTML 的 <embed> 元素
前端·数据库·html
油丶酸萝卜别吃8 小时前
Redis 布隆过滤器快速实现
数据库·redis·缓存
深念Y8 小时前
stable-diffusion.cpp 的 FLUX.2 Klein 9B 分步
java·前端·数据库
playboy1348 小时前
监控硬盘循环覆盖,监控数据恢复哪些情况还能找回录像
服务器·门控循环单元·智能硬件
whn19778 小时前
oracle 的ora-19633处理
数据库·oracle
承渊政道8 小时前
飞牛NAS部署Immich:搭建家庭相册并实现远程访问
运维·服务器·docker·内网穿透·cpolar·nas·immich
x-cmd8 小时前
用 Rust 打造 AI 时代的 SQL:把重复任务变成可执行文件
数据库·人工智能·sql·ai·容器·rust·workflow
小弥儿8 小时前
Firecrawl:把整个网页变成 AI 可查询的数据库
数据库·人工智能·学习
swordbob8 小时前
mysql数据库,明明有索引为啥不用
数据库·mysql