在 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
,而不是TRUE
或FALSE
。
3. SQL 中的 NULL
比较规则
SQL 的比较规则如下:
NULL
与任何非NULL
值进行比较(例如NULL = 'some_value'
或NULL != 'some_value'
)结果是UNKNOWN
。NULL
与NULL
的比较(例如NULL = NULL
)也返回UNKNOWN
,而不是TRUE
。- 只有明确使用
IS NULL
或IS NOT NULL
来检查NULL
。
所以,回到例子,appCode IS NULL
结果为 TRUE
时,appCode != 'app_yyy'
的结果是 UNKNOWN
,这会使得整个条件变成 TRUE AND UNKNOWN
。由于 AND
操作符中,TRUE AND UNKNOWN
的结果是 UNKNOWN
,因此该行记录不会被选中。