你真的會玩SQL嗎?讓人暈頭轉向的三值邏輯


你真的會玩SQL嗎?系列目錄

你真的會玩SQL嗎?之邏輯查詢處理階段

你真的會玩SQL嗎?和平大使 內連接、外連接

你真的會玩SQL嗎?三范式、數據完整性

你真的會玩SQL嗎?查詢指定節點及其所有父節點的方法

你真的會玩SQL嗎?讓人暈頭轉向的三值邏輯

你真的會玩SQL嗎?EXISTS和IN之間的區別

你真的會玩SQL嗎?無處不在的子查詢

你真的會玩SQL嗎?Case也瘋狂

你真的會玩SQL嗎?表表達式,排名函數

你真的會玩SQL嗎?簡單的 數據修改

你真的會玩SQL嗎?你所不知道的 數據聚合

你真的會玩SQL嗎?透視轉換的藝術

你真的會玩SQL嗎?冷落的Top和Apply

你真的會玩SQL嗎?實用函數方法匯總

你真的會玩SQL嗎?玩爆你的數據報表之存儲過程編寫(上)

你真的會玩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 ,常規條件表達式卻無法篩選出?

練習

以下對就返回哪三值?

答案

View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM