和exists
差異開始測試吧,現在測試使用in、
not in
可能帶來的「錯誤」。之所以錯誤,是因為我們總是以自然語言去理解
sql,卻忽略了數學中的邏輯語法。不廢話了,測試看看吧!
【測試一:
in子查詢】
[sql]view plain
copy
--返回在son中存在的所有father的資料
--正確的寫法:
select
* from
father
where
fid in(
select
fid
from
son)
--錯誤的寫法:
說明:
兩個查詢都執行沒有出錯,但是第二個tsql的子查詢寫錯了。子查詢(select oid from son)實際單獨執行會出錯,因為表son不存在欄位oid,但是在這裡系統不會提示錯誤。而且father表有4行資料,所有子查詢掃瞄了4次son表,但是第二個查詢中,實際也只掃瞄了1次son表,也就是son表沒有用到。
即使這樣寫也 不會出錯:
select
*from
father
where
fidin(
select
oid)
這個查詢的意思是,表father中每行的fid與oid比較,相同則返回值。
實際查詢是這樣的: select * from father where fid
= oid
測試一中,fid in(select fid from son)子查詢中包含null值,所以 fid in(null)返回的是乙個未知值。但是在刷選器中,false和unknown的處理方式類似。因此第乙個子查詢返回了正確的結果集。
【測試二:not in子查詢】
[sql]view plain
copy
--返回在son中不存在的所有father的資料
--錯誤的寫法:
select
* from
father
where
fid
notin
(select
fid
from
son)
--錯誤的寫法:
select
* from
father
where
fid
notin
(select
oid
from
son)
--正確的寫法:
說明:
檢視select fid from son,子查詢中有空值null,子查詢中的值為(2,3,null),謂詞fid in(2,3,null)永遠不會返回false,只反會true或unknown,所以謂詞fidnot in(2,3,null)只返回not true 或not unknown,結果都不會是true。所以當子查詢存在null時,not in和not exists 在邏輯上是不等價的。
總結:
in
或not in
在sql
語句中經常用到,尤其當子查詢中有空值的時候,要謹慎考慮。因為即使寫了「正確」的指令碼,但是返回結果卻不正確,也不出錯。在不是很理解的情況下,最好使用
exists
和not exists
來替換。而且
exists
查詢更快一些,因為只要在子查詢找到第乙個符合的值就不繼續往下找了,所以能用
exists
就用吧。
select
*from
father
awhere
exists(
select 1from
sonb
wherea.
fid=b.
fid)
select
*from
father
awhere
notexists(
select 1from
sonb
wherea.
fid=b.
fid)
T SQL基礎及T SQL分頁查詢
資料定義語言 ddl,data definition language 資料操縱語言 dml,data manipulation language 資料控制語言 dcl,data control language 核心作用主要用作用快速的條件查詢 運算子作用 判斷相等 大於 小於 大於等於 小於等於...
T SQL,動態聚合查詢
if exists select table name from information schema.tables where table name accountmessage drop table accountmessage gocreate table accountmessage ffu...
T SQL查詢高階 變數
變數對於一種語言是必不可少的一部分,當然,對於t sql來講也是一樣。在簡單查詢中,往往很少用到變數,但無論對於複雜的查詢或儲存過程中,變數都是必不可少的一部分.在t sql中,變數按生存範圍可以分為全域性變數 global variable 和區域性變數 local variable 1.全域性變...