In與Exist的區別

2021-06-01 10:25:01 字數 2794 閱讀 5380

in       ------ 遍歷

exists ------- 檢索到滿足條件即退出

not exists --------檢索到不滿足條件即退出

本質區別:

exists 由於exist屬於外驅動,故會利用索引來檢索資料

in 則屬於內驅動 故不能利用索引檢索資料

其中,in和not in類似全表掃瞄,效率低,一般用 exist和notexist代替其用法。

使用環境:

*exists 使用外連線查詢時用到。

*in    使用內連線查詢時用到。

e.g.:

in 的用法:

1selecttop10 exponame,expoclassid

2fromtb_expo

3whereexpoclassidin(selectclassidfromtb_expo_classwhereparentid=0)

其中,先執行 select classid from tb_expo_class where parentid=0

等價於:

1selecttop10 a.exponamefromtb_expo a,

2(selectclassidfromtb_expo_classwhereparentid=0) b

3wherea.expoclassid= b.classid

而exist不同:

1selecttop10 exponame,expoclassidfromtb_expo e

2whereexists (select0fromtb_expo_classwhereparentid=0)

其執行類似於下面的

sql:

01setserveroutputon;

02declare

03l_countinteger;

04begin

05fortb_expoin(selectexponame,expoclassidfromtb_expo)   loop

06selectcount(*)intol_countfromtb_expo_class

07whereparentid = 0

08

09if l_count != 0then

10dbms_output.put_line(e.exponame);

11endif;

12

13endloop;

14end

在查詢資料量大的時候就會體現出效率來。

當然,也不能說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是對外表進行迴圈,然後在內表進行查詢。適用範圍 當查詢字段進行了索...