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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/544523.html
標籤:其他
