【開發篇sql】 條件和表示式(六) Exists, not exsists,in ,not in

yellowlee發表於2010-05-15

6Exists, not exsists,in ,not in

 

先來描述一下oracle的連線和子查詢,在很多情況下,連線和子查詢可以相互替代,這時候如何選擇使用很多是憑個人習慣,不過二者在執行的效率問題上面確並不是完全一樣的,往往需要根據具體的資料量的大小結合執行計劃來調整。

inexists同樣可以相互替代,也需要根據具體的情況來選擇使用。使用in的情況下,oracle有限查詢子查詢,然後匹配外層查詢,exists則剛好相反。

一般來說,後面的子查詢結果集如果比較小的話,一般使用in,如果子查詢較大,而外層的查詢相對較小,則使用exists

Not in not exists則不能完全替換,他們有一些差異。具體先看一個例子:

SQL> select * from t_test_chr a ;

 

TYPE TYPE_VARCHAR2        TYPE_NVARCHAR2

---- -------------------- --------------------

1111 1111                 1111

1

 

SQL> select * from t_test_chr a where not exists (select 1 from t_test_chr where type_varchar2 = a.type_varchar2 );

 

TYPE TYPE_VARCHAR2        TYPE_NVARCHAR2

---- -------------------- --------------------

1

SQL> select * from t_test_chr a where type_varchar2 not in (select type_varchar2 from t_test_chr);

 

no rows selected

 

exists in分別的結果是:

SQL> select * from t_test_chr a where exists (select 1 from t_test_chr where type_varchar2 = a.type_varchar2 );

 

TYPE TYPE_VARCHAR2        TYPE_NVARCHAR2

---- -------------------- --------------------

1111 1111                 1111

 

SQL> select * from t_test_chr a where type_varchar2 in (select type_varchar2 from t_test_chr);

 

TYPE TYPE_VARCHAR2        TYPE_NVARCHAR2

---- -------------------- --------------------

1111 1111                 1111

 

這樣區別就一目瞭然了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-662801/,如需轉載,請註明出處,否則將追究法律責任。

相關文章