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 一定是選乙個字段...