1. 程式人生 > >Oracle 中關鍵字 ‘exists‘ 與 ‘in’ 詳解

Oracle 中關鍵字 ‘exists‘ 與 ‘in’ 詳解

  • IN(list) 和 NOT IN(list) 等於列表其一和不等於列表其一,IN(list) 還常用於判斷一個子查詢的結果集;
  • EXISTS(): 用在where中作為過濾條件,其後跟一個子查詢,只要子查詢可以查出至少一條資料,那麼EXISTS就返回TRUE;

舉例對比效率問題:

  1. select * from T1 where exists(select b from T2 where T1.a = T2.a);
    【當T1資料量小而T2資料量非常大的時候,此句效率高】
    exists中資料存在則說明where條件成立; 不存在或報語法錯誤,則where不成立,相當於執行了select * from T1

  2. select * from T1 where T1.a in(select T2.a from T2);
    【當T1資料量非常大而T2資料量小時,此句效率高】
    in後面搜尋出來的欄位內容要與T1相對應,T1和T2兩個表中的a欄位表達意義應是一樣的才行,否則沒意義。

  3. select name from employee where name not in (select name from student);
    select name from employee where not exists (select name from student);
    第二句的sql效率要高於第一句;
    通過使用EXISTS,Oracle會首先檢查主查詢,然後執行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle在執行IN子查詢時,首先執行子查詢,並將獲得的結果列表存放在一個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中以後再執行主查詢。這也就是使用EXISTS比使用IN通常查詢速度快的原因。