轉自ITPUB(DingJun):
集合操作
簡表:
Operator |
Returns |
Content |
UNION |
由每個查詢選擇的所有不重複的行 |
並集不包含重複值,默認按第1個查詢的第1列升序排列 |
UNION ALL |
由每個查詢選擇的所有的行,包括所有重複的行 |
包括所有重複的行 完全並集包含重複值,不排序 |
INTERSECT |
由每個查詢選擇的所有不重複的相交行 |
交集,不包含重複行,按第1個查詢的第1列升序排列 |
MINUS |
在第一個查詢中,不在後面查詢中的行 |
不包含重複行,按第1個查詢的第1列升序排列 |
UNION和UNION ALL
UNION(聯合)運算:
UNION運算返回所有由任一查詢選擇的行。用UNION運算從多表返回所有行,但除去任何重複的行。
原則:
-
被選擇的列數和列的數據類型必須是與所有用在查詢中的SELECT語句一致。列的名字不必相同。
- 聯合運算在所有被選擇的列上進行。
-
在做重複檢查的時候不忽略空(NULL)值。(如果有重複空行,則保留一個空行)
-
IN運算有比UNION運算高的優先級。
-
在默認情況下,輸出以SELECT子句的第一列的升序排序。
全聯合(UNION ALL)運算:
用全聯合運算從多個查詢中返回所有行。
原則:
- 和聯合不同,重複的行不被過濾,並且默認情況下輸出不排序。
Union all效率一般比union高。Union all內部不做排序工作,也不做剔除重複行工作,而union則做這個工作。
使用:
Select statementunion | union all Select statement…..;
intersect交集操作
用相交運算返回多個查詢中所有的公共行。 無重複行。
原則:
-
在查詢中被 SELECT 語句選擇的列數和數據類型必須與在查詢中所使用的所有的SELETCT語句中的一樣,但列的名字不必一樣。
-
相交的表的倒序排序不改變結果。
-
相交不忽略null值。
使用:
Select statementintersect Select statement….;
minus差集操作
相減運算,求差集。無重複行。
用相減運算返回由第一個查詢返回的行,那些行不出現在第二個查詢中 (第一SELECT語句減第二個SELECT語句)。
原則:
- 在查詢中被SELECT語句選擇的列數和數據類型必須與在查詢中所使用的所有的SELTCT語句中的一樣,但列的名字不必一樣。
- 對於MINUS運算,在WHERE子句中所有的列都必須在SELECT子句中。
使用:
Select statement minusSelect statement….;
集合運算的原則
- 在兩個SELECT 列表中的表達式必須在數目上和數據類型上相匹配
- 可以用圓括號改變執行的順序
- ORDER BY子句:
- 只能出現在語句的最後
- 從第一個SELECT語句接收列名、別名,或者位置記號.查詢結果的列名與第一個SELECT 語句保持一致。
- 可以用於子查詢。
- 除了UNION ALL,重複行自動被清除
- 在結果中的列名是第一個查詢中出現的列名
- 除了UNION ALL,默認情況下按升序順序輸出。除union all外,其他的都做排序工作,而且都剔除重複結果。
總結
所有的集合運算與等號的優先級相同,如果SQL語句包含多個集合運算並且沒有圓括號明確地指定另一個順序,Oracle服務器將以從左到右的順序計算。你應該使用圓括號來明確地指定帶另外的集合運算的INTERSECT (相交)運算查詢中的賦值順序。
集合操作是對多個查詢結果進行並集,差集,交集的操作,都不忽略null行。
除了union all 默認不做排序和剔除重複行的操作外,union,minus,intersect都默認按第1個查詢結果的第1列進行升序排列,並且不包含重複行。對集合運算的結果要排序,只能在最後一個select 後面排序,是對整個集合操作進行排序,而不是對最後一個select 進行排序,排序選擇的列必須是第1個select 中出現的列,如果有別名,則使用別名,不能選用沒有查詢出來的列(這和普通的order by不一樣,普通的order by可以選用不在select中的列排序),當然可以按位置指定order by,比如order by 1 desc,就是按第1列降序。在業務要求允許的情況下,能使用union all就不要使用union,因爲unionall不做排序剔重操作,使用union all效率方面要好點。