你真的會玩SQL嗎?系列目錄
先來看一個問題:a not in (b,c,null),返回什么?
是不是有時辛辛苦苦寫了個查詢,但顯示的不是想要的答案?讓我們來看看其中的一個陷阱。
我們篩選為某列值為NULL的行,一般會采用如下的方式:select * from tb where col=null
但這無法得到我們想要的結果的,正確的方式是col is null 為什么呢?這就涉及到三值邏輯。
三值邏輯
在SQL中邏輯表達式的可能值包括TRUE、FALSE和UNKNOWN。它們被稱之為三值邏輯。
三值邏輯是SQL所特有的。大多數編程語言的邏輯表達式只有TRUE或FALSE兩種值。
SQL中的UNKNOWN邏輯值通常出現在包含NULL值的邏輯表達式中,例如,下面這三個表達式值都是UNKNOWN:
NULL<42; NULL=NULL; X+NULL>Y;
UNKNOWN值也是確定的,只是不同情況下有時為true有時為false,一個總原則是:UNKNOWN值非真即假,非假即真,UNKNOWN只能取true和false中的一個,但UNKNOWN的相反還是UNKNOWN
在on\where和having中做過濾條件時,UNKNOWN看作false,在check中被看作true,在條件中兩個null比較結果是UNKNOWN。(建設表中包含一個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值排列在一起。
知道了為什么在查詢中篩選null的時候需要使用 is null 或者is not null ,常規條件表達式卻無法篩選出?
練習
以下對就返回哪三值?
答案

