Oracle中in與exists使用上的區別

2021-08-23 15:18:09 字數 1244 閱讀 5448

in與exists處理起來是非常不同的。

1.這裡使用in方式關聯兩個表,稱為第乙個查詢。

select * from t1 where x in(select y from t2);

這條sql語句處理起來就像如下:

select *

from t1,(select distinct y from t2)t2

where t1.x = t2.y;

這個子查詢被評估,去重複(distincted), 被使用索引(indexed)(或者 hashed 或者 sorted),然後與原始表(t1表)連線

2.這裡使用exists方式關聯兩個表,稱為第二個查詢。

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

這條sql語句被處理起來更像:

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表產生乙個全表掃瞄(full scan),然而第乙個查詢能夠使用t1表的x列上的索引。

所以,大家有疑問了,在什麼時候,在**,使用exists適合,或者不適合呢?

好的,下面來看看這個子查詢的結果

如果

(select y from t2)
這個表很大,需要花費很長的時間。但是t1表相對小,
(select null from t2 where y = x.x)
這個查詢的執行速度非常快(之所以快,得益於t2表y列上的索引),那麼exists將會更快。這裡,首先全表掃瞄t1表,對t2做索引查詢能夠比全表掃瞄t2表,再構建distinct子查詢花更少的時間。

如果

(select y from t2)
子查詢的結果小,那麼in更合適。

如果子查詢和外表都很大(exists和in查詢時間差不多),那麼就依賴於索引和其他因素了。

ORACLE 中exist和in的區別

博文 oracle中的exists 和not exists 用法 博文 in與exists語句的效率問題 一 exists sql 返回結果集為真 notexists sql 不返回結果集為真 如下 表a id name 1a1 2a2 3a3 表b id aid name 11b1 22b2 32...

sql中exist與in的區別

in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...

sql中exist與in的區別

in 和 exists也是很好區別的.in 是乙個集合運算子.a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段...