在此將紹資料中常用的集合(SET)指令,如聨集(UNION)、聨集不剔除重複(UNION
ALL)、交集(INTERSECT)、差集(MINUS)。
集合(SET)指令的目的是將兩個(含以上)SQL指令所產生的結果合併起來,由於是將兩個(含以上)的資料集進行合併,因此在資料欄位數量上必需相等,並且型態上則需必需相容,若由於資料來源上的限制無法提供相同欄位數量的資料時,則不足部分可以使用NULL值取代,使其數量相符。
以下以A、B兩個表格,其中A表格資料為1~4,B表格為3~5,分別進行說明:
A
|
B
|
A、B配對
|
|||||||||||||||||||||
|
|
|
UNION(聯集)
|
UNION ALL(聯集)
|
INTERSECT(交集)
|
EXCEPT(差集)
|
|||||||||||||||||||||
圖示
|
|
|
|
|
||||||||||||||||||||
結果
|
|
|
|
|
||||||||||||||||||||
說明
|
重複資料只顯示一次
A與B資料中,兩者均有3、4但UNION操作時,只保留一部分,另外重複部分將被剔除
|
所有資料都會顯示。不管是否重複。
前一項中所說因A與B資料集中,兩者均有(3, 4)對於UNION ALL將保留所有資料
|
只顯示重複(A U B 交集)共同擁有)資料,即A與B交集部分。
|
A – A U B
差集是將A的資料但剔A與B交集部分
|
對於如聯集(UNION)、聯集不剔除重複(UNION ALL)、交集(INTERSECT)、差集(MINUS)四種集合運算,ORACLE均支援;對於SQL SERVER 2000僅支援UNION及UNION ALL指令,SQL SERVER 2005以上版本(包含2008 )的集合運算更提供交集(INTERSECT)、差集(MINUS)運算指令,後續僅以SQL SERVER 2005代表2005及2008版本。
1. 聯集(UNION)
UNION指令會剔除重複的資料,此指令概念上是先將資料合併後,然後再執行DISTINCT的指令(資料庫系統自動處理),為達到剔除重複資料目的則需進行排序動作,使用UNION指令前需先思考剔除重複資料的必要性,尤其大量資料處理時,將造成記憶體(Memory)甚至是I/O(一旦使用到磁碟為排序暫存空間,則系統效能會大幅降低)的額外系統資源浪費。若剔除重複資料需求的答案為否定,則請使用UNION ALL指令。
UNION ALL
|
UNION
|
|||||||||||
SQL
|
SELECT 'B' AS COL
UNION ALL
SELECT 'A' AS
Val
UNION ALL
SELECT 'B' AS Result
|
SELECT 'B' AS COL
UNION
SELECT 'A' AS Val
UNION
SELECT 'B' AS Result
|
||||||||||
結果
|
|
|
若要更清楚了解資料庫系統內部運作,可以試著觀察採用UNION以及UNION ALL指令時的執行計劃(Execution
Plan),藉此了解系統內部運作方式。兩者差異整理如下表所示:
圖示
|
說明
|
|
UNION (聯集)
ü 重複資料只顯示一次
ü 會刪除重複的資料(相當於執行DISTINCT,會有排序動作)
|
|
UNION ALL
ü 所有資料都會顯示.不管是否重複
ü 不會刪除重複的資料,較佳的執行效能
|
2. 交集(INTERSECT)
MSSQL 2005(含)以上版本及ORACLE提供INTERSECT指令和UNION類似,也是對兩個SQL語句所產生的結果做處理,差別在於UNION概念上是一個OR的作法,資料只要存在任何一個資料集,均會被選出(聯集);而INTERSECT概念則是AND,需同時存在於各資料集,資料才會被選出(交集),概念如下圖所示:
MSSQL 2005(含)及ORACLE提供INTERSECT指令,語法相同。
[SQL 語句-1]
INTERSECT
[SQL 語句-2]
|
但MSSQL 2000中並無提供此種指定,可由前述定義需同時存在於A、B此與表格內部結合(INNER JOIN)的概念類似,可藉此達成相同功能。
資料庫
|
SQL
|
說明
|
MSSQL2005(含)以上、ORACLE
|
SELECT N
FROM #A
INTERSECT
SELECT N
FROM #B
|
MSSQL2005(含)以上、ORACLE均使用INTERSECT指令
|
SQL SERVER 2000
|
SELECT A.N
FROM A
INNER JOIN B
ON A.N = B.N
|
MSSQL2005、ORACLE均使用INTERSECT指令
|
3. 差集(MINUS)
在MSSQL 2005(含)以上提供EXCEPT指令,此指令與ORACLE的MINUS指令類似,第一個資料集與第二個資料集相比較,資料只存在於第一個資料集,但不存在於第二個資料集的值(即相減),以數學式來表示為:A – A U B,於A資料集中剔除與B交集的資料。其概念如下圖所示:
對於差集運算MSSQL2005(含)以上版本及ORACLE分別提供EXCEPT及MINUS指令,語法如下:
MSSQL2005(含)以上
|
ORACLE
|
[SQL 語句-1]
EXCEPT
[SQL 語句-2]
|
[SQL 語句-1]
MINUS
[SQL 語句-2]
|
在MSSQL2000無此指令時,則可以使用外部結合(OUTER JOIN),同樣可解決此問題。
資料庫
|
SQL
|
說明
|
MSSQL 2005
|
SELECT N
FROM A
EXCEPT
SELECT N
FROM B
|
使用EXCEPT指令, 2005以上才支援
|
ORACLE
|
SELECT N
FROM A
MINUS
SELECT N
FROM B
|
使用MINUS指令
|
MSSQL 2000
|
SELECT A.N
FROM A
LEFT OUTER JOIN B
ON A.N
=
B.N
WHERE B.N IS NULL
|
當無差集指令時(或效能不佳狀況時)則可改用OUTER
JOIN來處理
|
集合運算是將兩個資料集進行運算,對於以上四種類型的集合(SET)指令,使用上均需注意以下限制條件。
1.
欄位數目需一致
2.
欄位型態需相容
資料型態相容是指同類型的資料型態,如CHAR、VARCHAR及NVARCHAR同屬字元型態,才准許進行集合(SET)運算。
3.
傳回結果集的欄位名稱是以第一個資料集為依據
4.
排序操作
需將ORDER BY子句置於整組SQL最後部分,排序可使用第一組資料集的欄位名稱,或使用欄位需欄位位置即數值。
沒有留言:
張貼留言