查詢語句中in和exists的區別

 

in 編程

in能夠分爲三類: oop

1、 優化

形如select * from t1 where f1 in &aposa ', &aposb '),應該和如下兩種比較效率 spa

 

  select * from t1 where f1= &aposa &apos or f1= &aposb &apos 索引

  或者 select * from t1 where f1 = &aposa &apos union all select * from t1 f1= &aposb &apos hash

  你可能指的不是這一類,這裏不作討論。 io

2、 效率

形如select * from t1 where f1 in select f1 from t2 where t2.fx= &aposx '), select

 

  其中子查詢的where裏的條件不受外層查詢的影響,這類查詢通常狀況下,自動優化會轉成exist語句,也就是效率和exist同樣。 循環

3、

形如select * from t1 where f1 in select f1 from t2 where t2.fx=t1.fx),

 

  其中子查詢的where裏的條件受外層查詢的影響,這類查詢的效率要看相關條件涉及的字段的索引狀況和數據量多少,通常認爲效率不如exists.

  除了第一類in語句都是能夠轉化成exists 語句的,通常編程習慣應該是用exists而不用in.

  AB兩個表,

  (1)當只顯示一個表的數據如A,關係條件只一個如ID時,使用IN更快:

  select * from A where id in select id from B

  (2)當只顯示一個表的數據如A,關係條件不僅一個如IDcol1時,使用IN就不方便了,可使用EXISTS

  select * from A

  where exists select 1 from B where id = A.id and col1 = A.col1

  (3)當只顯示兩個表的數據時,使用INEXISTS都不合適,要使用鏈接:

  select * from A left join B on id = A.id

  因此使用何種方式,要根據要求來定。

 

exists

exists是用來判斷是否存在的,當exists(查詢)中的查詢存在結果時則返回真,不然返回假。not exists則相反。

exists作爲where 條件時,是先對where前的主查詢詢進行查詢,而後用主查詢的結果一個一個的代入exists的查詢進行判斷,若是爲真則輸出當前這一條主查詢的結果,不然不輸出。

 

inexists區別

in 是把外表和內表做hash 鏈接,而exists是對外表做loop循環,每次loop循環再對內表進行查詢。

一直以來認爲existsin效率高的說法是不許確的。

若是查詢的兩個表大小至關,那麼用inexists差異不大。

若是兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in

NOT EXISTS,exists的用法跟in不同,通常都須要和子表進行關聯,並且關聯時,須要用索引,這樣就能夠加快速度。

 

exists 至關於存在量詞:表示集合存在,也就是集合不爲空只做用一個集合。

例如 exist P 表示P不空時爲真; not exist P表示p爲空時爲真。

in表示一個標量和一元關係的關係。

例如:s in P表示當sP中的某個值相等時 爲真; s not in P 表示sP中的每個值都不相等時爲真:

 

not in not exists的區別

若是查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;

not extsts 的子查詢依然能用到表上的索引。

因此不管那個表大,用not exists都比not in要快。

相關文章
相關標籤/搜索