天天看點

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

練習

以下對就傳回哪三值?

答案

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

View Code

作者:歡醉

公衆号【一個碼農的日常】 技術群:319931204 1号群: 437802986 2号群: 340250479

出處:http://zhangs1986.cnblogs.com/

碼雲:https://gitee.com/huanzui

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

Top