1 集操作 定義:把多個sql的結果集,通過邏輯上的整合運算,拼在一起顯示。 集操作缺省下都是按第一個查詢的第一列升序排序,當然除了union all: minus:取差集,可用于對兩個結果集進行測試 union:取并集,除重 union all:取并集,不剔重 intersect:取交
1 集操作
定義:把多個sql的結果集,通過邏輯上的整合運算,拼在一起顯示。
集操作缺省下都是按第一個查詢的第一列升序排序,當然除了union all:
minus:取差集,可用于對兩個結果集進行測試
union:取并集,除重
union all:取并集,不剔重
intersect:取交集
–
注釋:
① union all不排序、不剔重,在效率上比union高。在業務允許下,用union all,則不用union
② 兩表作集操作時,字段類型、個數要相同,列的名字可以不必相同;若不一樣可補齊,補齊時應注意字段類型,進行顯示轉換:to_char、to_number、to_date等
③ 多個集操作可通過括號改變sql引擎的執行順序(缺省sql引擎是自頂向下)
④ union、minus和intersect的共同點:
剔重、排序、不忽略null
⑤ order by只能出現在語句的最后,是對整個集操作結果的排序,列名、別名或者按位置指定,但不能使用第一個select沒有出現的列
⑥ 第一個select語句接收列名、別名,或位置記號,查詢結果的列名和第一個select語句保持一致
⑦ 可以用于子查詢
2 exists、in的運用場景
能不寫子查詢,盡量不寫子查詢,而是直接編寫多表連接操作。理由如下:
① oracle CBO在parse階段,會盡可能把子查詢轉化為多表連接
② 子查詢可讀性較低
③ 復雜的邏輯,子查詢可能導致Oracle CBO選擇錯誤的執行路徑
但如果必須寫子查詢,到底是in還是exists?exists/not exists專門用于關聯子查詢。10g之后,Oracle對in的改進,這兩者無甚區別。
in和select的技術原理:
㈠ in:先進行子查詢,再進行主查詢
㈡ exists:先進行主查詢,再到子查詢中過濾
in和exists的使用建議:
Ⅰ 如果限制性強的條件在子查詢,則使用in
Ⅱ 如果限制性強的條件在主查詢,則使用exists
可用查詢結果集來理解上面這段話,采用最優化匹配原則:拿最小記錄匹配大記錄。限制性強,則結果集小;反之,則大。
注釋:
① 使用exists可以將子查詢結果定位常量,不影響查詢結果,而且,效率高。
比如:
1.select e.*?
2.? from emp e? 3. where exists?? 4. (select 1 from dept d? 5.?? where e.deptno=d.deptno and? 6.???????? d.dname=’SALES’)? ② not in可能會因為null而改變其行為導致和not exists結果集有出入。然而,在相關子查詢下,not in和not exists的結果集是一樣的。