oracle中in和exists的區別

2022-06-05 15:12:09 字數 1547 閱讀 4496

in 和 exists區別

in 是把外表和內錶作hash join,而exists是對外表作loop,每次loop再對內表進行查詢。

一直以來認為exists比in效率高的說法是不準確的。

如果查詢的兩個表大小相當,那麼用in和exists差別不大。

如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in:

例如:表a(小表),表b(大表)

1:select * from a where cc in (select cc from b)

效率低,用到了a表上cc列的索引;

select * from a where exists(select cc from b where cc=a.cc)

效率高,用到了b表上cc列的索引。

相反的2:

select * from b where cc in (select cc from a)

效率高,用到了b表上cc列的索引;

select * from b where exists(select cc from a where cc=b.cc)

效率低,用到了a表上cc列的索引。

帶in的關聯子查詢是多餘的,因為in子句和子查詢中相關的操作的功能是一樣的。如:

select staff_name from staff_member where staff_id in

(select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);

為非關聯子查詢指定exists子句是不適當的,因為這樣會產生笛卡乘積。如:

select staff_name from staff_member where staff_id

exists (select staff_id from staff_func);

not in 和not exists

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

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

所以無論哪個表大,用not exists都比not in要快。

盡量不要使用not in子句。使用minus 子句都比not in 子句快,雖然使用minus子句要進行兩次查詢:

select

staff_name from staff_member where staff_id in (select staff_id from

staff_member minus select staff_id from staff_func where func_id like

'81%');

in 與 "=" 的區別

select name from student where name in ('zhang','wang','li','zhao');

與select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

的結果是相同的。

ORACLE 中exist和in的區別

博文 oracle中的exists 和not exists 用法 博文 in與exists語句的效率問題 一 exists sql 返回結果集為真 notexists sql 不返回結果集為真 如下 表a id name 1a1 2a2 3a3 表b id aid name 11b1 22b2 32...

oracle常識(一) in和exist的區別

in 與 exist 的語法比較 select from 資料表 t where t.x in 括號內可以是符合t.x欄位型別的值集合,如 1 2 3 但如果t.x是number型別的時候,似乎這樣的寫法會出問題 也可以是通過另外的select語句查詢出來的值集合,如 select y from 資...

sql中in和exist語句的區別?

in和exists in 是把外表和內錶作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。如果兩個表中乙個較小,乙個是大表,則子查詢表大的用exists,子查詢錶小的用in 例如 表a 小表 表b 大表 1 select from a where cc in ...