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 ...