Oracle中exists與in區別

2021-06-19 10:10:32 字數 1359 閱讀 1517

in 與 exist 的語法比較:

select × from 資料表 t where t.x in (...)

括號內可以是符合t.x欄位型別的值集合,如('1','2','3'),但如果t.x是number型別的時候,似乎這樣的寫法會出問題;也可以是通過另外的select語句查詢出來的值集合,如(select y from 資料表2 where ...)。

select * from 資料表 t where [...] and exist (...)

方括號內為其它的查詢條件,可以沒有。exist後面的括號內可以是任意的條件,這個條件可以與外面的查詢沒有任何關係,也可以與外面的條件結合。如:(select * from 資料表2 where 1=1) 或 (select * from 資料表2 where y=t.x)

例子:in的sql語句

select id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime

from tab_oa_pub where is_check=1 and

category_id in (select id from tab_oa_pub_cate where no='1')

order by begintime desc

exists的sql語句

select id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime

from tab_oa_pub where is_check=1 and

exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1')

order by begintime desc

效率比較:

select * from t1 where exists ( select null from t2 where y = x )

可以理解為:

for x in ( select * from t1 )

loop

if ( exists ( select null from t2 where y = x.x ) then

output the record!

end if

end loop

這個更容易理解,t1永遠是個表掃瞄!因此t1絕對不能是個大表,而t2可以很大,因為y=x.x可以走t2.y的索引。

綜合以上對in/exists的討論,我們可以得出乙個基本通用的結論:in適合於外表大而內錶小的情況;exists適合於外表小而內錶大的情況。

oracle中in與exists的區別

exists是用來判斷是否存在的,當exists中的查詢存在結果時則返回真,否則返回假。not exists則相反。exists做為where 條件時,是先對where 前的主查詢詢進行查詢,然後用主查詢的結果乙個乙個的代入exists的查詢進行判斷,如果為真則輸出當前這一條主查詢的結果,否則不輸出...

Oracle中exists與in的區別

有兩個簡單例子,以說明 exists 和 in 的效率問題 1 select from t1 whereexists select 1 from t2 where t1.a t2.a t1資料量小而t2資料量非常大時,t1 2 select from t1 where t1.a in select ...

Oracle中exists與in的區別

有兩個簡單例子,以說明 exists 和 in 的效率問題 1 select from t1 whereexists select 1 from t2 where t1.a t2.a t1資料量小而t2資料量非常大時,t1 2 select from t1 where t1.a in select ...