SQL支持用NULL符號來表示缺少的值,它使用的是三值謂詞邏輯,計算結果可是以TURE、FALSE或UNKNOWN。 SQL中不同語言元素處理NULL和UNKNOWN的方式也有所不同,如果邏輯表達式只涉及已經存在的值,那麼最終的計算結果只有二種,要麼TRUE要麼FALSE。但是當邏輯表達式涉及缺少的 ...
SQL支持用NULL符號來表示缺少的值,它使用的是三值謂詞邏輯,計算結果可是以TURE、FALSE或UNKNOWN。
SQL中不同語言元素處理NULL和UNKNOWN的方式也有所不同,如果邏輯表達式只涉及已經存在的值,那麼最終的計算結果只有二種,要麼TRUE要麼FALSE。但是當邏輯表達式涉及缺少的值時,其計算結果就是UNKNOWN。如,當謂詞salary>0:當salary等於1000時,表達式結果為TRUE,查詢過濾條件(WHERE和HAVING子句)能夠讓表達式計算結果為TRUE的那些行或組被返回;當salary等於-100時,表達式計算結果為FALSE,查詢過濾條件(WHERE和HAVING子句)能夠讓表達式計算結果為FALSE的那些行或組被返回;當salary是NULL時,表達式的計算結果就是UNKNOWN,查詢過濾條件(WHERE和HAVING子句)不返回任何行。
在不同的語言元素中,SQL對UNKNOWN的處理也有所不同。SQL對查詢過濾條件處理的正確定義是:“接受TRUE”就意味著要過濾掉FALSE和UNKNOWN。反之,對SQL對CHECK約束處理的正確定義是:“拒絕FALSE”就意味著接受TRUE和UNKNOWN。如果SQL使用的是二值謂詞邏輯,那麼“接受TRUE”和“拒絕FALSE”就不會有什麼區別。但在三值謂詞邏輯中,“接受TRUE”則會拒絕UNKNOWN和FALSE,而拒絕FALSE則會接受UNKNOWN和TRUE。前面的例子使用了謂詞salary>0,一個取值為NULL的salary將導致表達式計算結果為UNKNOWN。如果這個謂詞出現在查詢的WHERE子句中,則salary列取值為NULL的行也將會過濾掉。如果在表的CHECK約束中也包含這個謂詞條件,則salary列取值為NULL的行也將被過濾掉。
UNKNOWN對它取反時,結果還是UNKNOWN。兩個NULL值進行比較的表達式,其計算結果還是UNKNOWN。因為NULL值代表一個缺少的值或不可知的值,為此SQL提供了兩個謂詞IS NULL和IS NOT NULL,用來取代=NULL和<>NULL。
在用於比較和排序目的的不同元素中,SQL處理NULL的方式也有所不同,一些元素認為兩個NULL值彼此相等,而另一些則認為這它們不相等。
例如,當進行分組和排序時,認為二個NULL值是相等的。也就是說GROUP BY子句會在每個組中重新組織所有的NULL值,就像有具體值的列一樣;