null和其他值比較都是unknown
在SQL中邏輯表達式的可能值包括TRUE、FALSE、UNKNOWN。他們被稱為三值邏輯。三值邏輯是SQL所特有的。大多數的變成語言的邏輯表達式 只有TRUE或FALSE兩種值。SQL中的UNKNOWN通常出現在包含NULL值的邏輯表達式中(例如,下面的邏輯值都是 UNKNOWN:NULL>42;NULL=NULL;X+NULL>Y)。NULL值通常表示丟失或不相關的值。當比較丟失值和另一個值 (這個值也可能是NULL)時,邏輯結果總是UNKNOWN。
處理UNKNOWN邏輯結果和NULL時非常容易混淆。NOT TRUE等於FALSE,NOT FALSE等於TRUE,而否定的UNKNOWN(NOT UNKNOWN)還是UNKNOWN。
UNKNOWN邏輯結果和NULL在不同的語言元素中被區別對待。例如,所有的查詢篩選器(ON、WHERE 、HAVING)都把UNKNOWN當作FALSE處理。使篩選器為UNKNOWN的行會被排除在結果集之外。而CHECK約束中的UNKNOWN值被當 作TRUE對待。假設表中包含一個CHECK約束,要求salary列的值必須大於0。向該表插入salary為NULL的行時可以被接受,因為 (NULL>0)等於UNKNOWN,在CHECK約束中被視為和TRUE一樣。
在篩選器中比較兩個NULL值將得到UNKNOWN,會被當作FALSE處理,就好像其中一個NULL不等於另一個NULL。而UNIQUE約束、排序操作和分組操作認為兩個NULL值是相等的。
- 如果表中有一列定義了UNIQUE約束,將無法向表中插入該列值為NULL的兩行。
- GROUP BY子句把所有的NULL值分到一組。
- ORDER BY子句把所有NULL值排列在一起。
總之,了解UNKNOWN邏輯結果和NULL在不同語言元素中被處理的方式是有好處的,這樣可以避免以后出現麻煩。