解析 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,因此该行记录不会被选中。

相关推荐
爱上语文3 分钟前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
lifallen17 分钟前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
m0_6948455727 分钟前
服务器如何配置防火墙规则开放/关闭端口?
linux·服务器·安全·云计算
阿巴~阿巴~1 小时前
Linux基本命令篇 —— alias命令
linux·服务器·bash
Brookty1 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
先做个垃圾出来………2 小时前
SQL的底层逻辑解析
数据库·sql
好名字更能让你们记住我2 小时前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos
码不停蹄的玄黓2 小时前
深入拆解MySQL InnoDB可重复读(RR)隔离级别:MVCC+临键锁如何「锁」住一致性?
数据库·mysql·可重复读
门思科技2 小时前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网
小锋学长生活大爆炸2 小时前
【知识】RPC和gRPC
服务器·网络协议·rpc