[轉貼]Oracle集合的用法

轉自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效率方面要好點。

 

發佈了15 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章