第一章 神奇的SQL之三值逻辑和NULL
三值逻辑和NULL
概述
两种NULL、三值逻辑还是四值逻辑
NULL是产生三值逻辑的“元凶”
两种NULL分为两种:1.未知 2.不正确不适用
未知:表示有前提假设,有处理过程,但是结果不知道是怎么样的
不适用:前提就不对,那基于前提的处理结果,就本就不合理。
NULL并不是值。
三值:unknown,但是不同于NULL的一种。
unknown 是一种明确的布尔型的真值,而NULL中的UNKNOWN不是值也不是变量。
三值真值表(NOT):
|x |NOT x|
—– |—-
|t | f|
|u | u|
|f | t|
AND | t | u | f | |
---|---|---|---|---|
t | t | u | f | |
u | u | u | f | |
f | f | f | f |
OR | t | u | f | |
---|---|---|---|---|
t | t | t | t | |
u | t | u | u | |
f | t | u | f |
真值的优先级:
and: false > unknown >true
or : true > unknown >false
而在某列未设置非空的情况下,实际上是有可能不能直接比较的
IN 和EXISTS 的等价的
但是 NOT IN 和NOT EXISTS并不是等价的。
EXISTS不会返回unknown结果,而in 可以返回
本节要点:
NULL 不是值。
因为 NULL 不是值,所以不能对其使用谓词。
对 NULL 使用谓词后的结果是 unknown 。
unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样。
- 按步骤追踪 SQL 的执行过程能有效应对 4 中的情况。