《SQL进阶教程》

第一章 神奇的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 可以返回

本节要点:

  1. NULL 不是值。

  2. 因为 NULL 不是值,所以不能对其使用谓词。

  3. 对 NULL 使用谓词后的结果是 unknown 。

  4. unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样。

    1. 按步骤追踪 SQL 的执行过程能有效应对 4 中的情况。