有兩個簡單例子,以說明 「exists」和「in」的效率問題
1) select * from t1 where exists(select 1 from t2 where t1.a=t2.a) ;
t1資料量小而t2資料量非常大時,t1<2) select * from t1 where t1.a in (select t2.a from t2) ;
t1資料量非常大而t2資料量小時,t1>>t2 時,2) 的查詢效率高。
exists 用法:
請注意 1)句中的有顏色字型的部分 ,理解其含義;
其中 「select 1 from t2 where t1.a=t2.a」 相當於乙個關聯表查詢,相當於
「select 1 from t1,t2 where t1.a=t2.a」
但是,如果你噹噹執行 1) 句括號裡的語句,是會報語法錯誤的,這也是使用exists需要注意的地方。
「exists(***)」就表示括號裡的語句能不能查出記錄,它要查的記錄是否存在。
因此「select 1」這裡的 「1」其實是無關緊要的,換成「*」也沒問題,它只在乎括號裡的資料能不能查詢出來,是否存在這樣的記錄,如果存在,這 1) 句的where 條件成立。
in 的用法:
繼續引用上面的例子
「2) select * from t1 where t1.a in (select t2.a from t2) 」
這裡的「in」後面括號裡的語句搜尋出來的字段的內容一定要相對應,一般來說,t1和t2這兩個表的a欄位表達的意義應該是一樣的,否則這樣查沒什麼意義。
打個比方:t1,t2表都有乙個字段,表示工單號,但是t1表示工單號的欄位名叫「ticketid」,t2則為「id」,但是其表達的意義是一樣的,而且資料格式也是一樣的。這時,用 2)的寫法就可以這樣:
「select * from t1 where t1.ticketid in (select t2.id from t2) 」
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通常查詢速度快的原因
sql中exists和in區別
參考文章 1.查詢順序 exists先執行主查詢,再去子查詢中查詢與其對應的結果,如果true則輸出記錄,否則不輸出。in先子查詢產生結果集,然後主查詢去結果集中找符合要求的字段列表,符合要求則輸出記錄,否則不輸出。2.內外表連線方式 exists是對外表做loop迴圈,再對內表進行查詢。in是把外...
關於oracle中in和exists
今天看sql語句的時候發現了exists這個關鍵字,記得剛用這個關鍵字的時候只知道它和關鍵字in的作用是一樣的,當時覺得無非就是我的條件匹配到子結果集裡面的資料。今天打算把這兩個關鍵字具體怎麼回事區分一下,上網上看了一下,懂了一些兩者的區別,其中還涉及到了效能問題,很吃驚!2018 11 8再次更新...
MySql中in和exists效率
詳見 mysql中的in語句是把外表和內錶作hash 連線,而exists語句是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。一直大家都認為exists比in語句的效率要高,這種說法其實是不準確的。這個是要區分環境的。如果查詢的兩個表大小相當,那麼用in和exists差別不大。如果兩個表中...