T SQL查詢 慎用 IN 和 NOT IN

2021-08-03 21:51:45 字數 3715 閱讀 1274

和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.全域性變...