解析 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 与其他值比较时的行为
我们以这个例子来分析一下:
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,因此该行记录不会被选中。
