你真的會玩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 ,正常條件表達式卻無法篩選出?
練習
以下對就傳回哪三值?
答案
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLrN2bsJEZlR3YhJHdu92Qvw1cy9GdhNWak5WSn5WaulGb0V3TvwVbvNmLzd2bsJmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.gif)
你真的會玩SQL嗎?讓人暈頭轉向的三值邏輯
View Code
作者:歡醉
公衆号【一個碼農的日常】 技術群:319931204 1号群: 437802986 2号群: 340250479
出處:http://zhangs1986.cnblogs.com/
碼雲:https://gitee.com/huanzui
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
Top