EXISTS語法解析 EXISTS 運算符用於判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。 比如說下邊的語法,子查詢中的column_name可以和主查詢中的列名字不一樣,因為子查詢只返回yes or no。 subquery 是一個受限的 SELECT 語 ...
EXISTS語法解析
EXISTS 運算符用於判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。
比如說下邊的語法,子查詢中的column_name可以和主查詢中的列名字不一樣,因為子查詢只返回yes or no。
subquery 是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
IN 語法解析
IN 操作符允許您在 WHERE 子句中規定多個值
SELECT column1, column2, ... FROM table_name WHERE column IN (value1, value2, ...);
IN比較好理解 就是判斷主查詢體中的欄位的值是否在子查詢結果集中存在
分析IN和EXISTS查詢過程
從效率來看: 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1數據量小而T2數據量非常大時,T1<<T2 時,1) 的查詢效率高。 2) select * from T1 where T1.a in (select T2.a from T2) ; T1數據量非常大而T2數據量小時,T1>>T2 時,2) 的查詢效率高。
3) select * from T1 where T1.a in (select T2.a from T2) ;
T1數據量非常大而T2數據量也非常大時,3) 的查詢效率高。
4) select * from T1 where T1.a in(exists) (select T2.a from T2) ; T1數據量非常小而T2數據量也非常小時,4) 的查詢效率都無所謂了差別不大。
簡而言之,一般式:外表大,用IN;內表大,用EXISTS。
執行方式:
通過使用EXISTS,Oracle會首先檢查主查詢,然後運行子查詢直到它找到第一個匹配項,這就節省了時間。Oracle在執行IN子查詢時,首先執行子查詢,並將獲得的結果列表存放在一個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起,待子查詢執行完畢,存放在臨時表中以後再執行主查詢。這也就是使用EXISTS比使用IN通常查詢速度快的原因。
in 是把外表和內表作hash 連接,而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列的索引。 附錄
本文來自博客園,作者:蚌殼裡夜有多長,轉載請註明原文鏈接:https://www.cnblogs.com/dbahrz/p/17137658.html