in ------ 遍歷
exists ------- 檢索到滿足條件即退出
not exists --------檢索到不滿足條件即退出
本質區別:
exists 由於exist屬於外驅動,故會利用索引來檢索資料
in 則屬於內驅動 故不能利用索引檢索資料
其中,in和not in類似全表掃瞄,效率低,一般用 exist和notexist代替其用法。
使用環境:
*exists 使用外連線查詢時用到。
*in 使用內連線查詢時用到。
e.g.:
in 的用法:
1
select
top
10 exponame,expoclassid
2
from
tb_expo
3
where
expoclassid
in
(
select
classid
from
tb_expo_class
where
parentid=0)
其中,先執行 select classid from tb_expo_class where parentid=0
等價於:
1
select
top
10 a.exponame
from
tb_expo a,
2
(
select
classid
from
tb_expo_class
where
parentid=0) b
3
where
a.expoclassid= b.classid
而exist不同:
1
select
top
10 exponame,expoclassid
from
tb_expo e
2
where
exists (
select
0
from
tb_expo_class
where
parentid=0)
其執行類似於下面的
sql:
01
set
serveroutput
on
;
02
declare
03
l_count
integer
;
04
begin
05
for
tb_expo
in
(
select
exponame,expoclassid
from
tb_expo) loop
06
select
count
(*)
into
l_count
from
tb_expo_class
07
where
parentid = 0
08
09
if l_count != 0
then
10
dbms_output.put_line(e.exponame);
11
end
if;
12
13
end
loop;
14
end
在查詢資料量大的時候就會體現出效率來。
當然,也不能說exist就比in好。
如果select 0 from tb_expo_class where parentid=0
查詢出來的資料量很少的話,還是 in 效率更高些。
Exist 與in 的區別
exist是乙個存在判斷,in是乙個集合運算子,a in 這個運算中,前面是乙個元素,後面是乙個集合,集合中的元素型別是和前面的元素一樣的.而exists是乙個存在判斷,如果後面的查詢中有結果,則exists為真,否則為假.in 運算用在語句中,它後面帶的select 一定是選乙個字段,而不是sel...
exist與in的區別
對於in 和 exists的效能區別 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in,反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變 這是效能變化的關鍵 如果是exists,那麼以外層表為驅動...
SQL server的Exist與in區別
exists 將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則exists子句返回true,這一行行可作為外查詢的結果行,否則不能作為結果。區別 in表是外邊和內錶進行hash連線,是先執行子查詢。exists是對外表進行迴圈,然後在內表進行查詢。適用範圍 當查詢字段進行了索...