2013年8月27日 星期二

集合(SET)運算概念

在此將紹資料中常用的集合(SET)指令,如聨集(UNION)聨集不剔除重複(UNION ALL)交集(INTERSECT)差集(MINUS)

集合(SET)指令的目的是將兩個(含以上)SQL指令所產生的結果合併起來,由於是將兩個(含以上)的資料集進行合併,因此在資料欄位數量上必需相等,並且型態上則需必需相容,若由於資料來源上的限制無法提供相同欄位數量的資料時,則不足部分可以使用NULL值取代,使其數量相符。

以下以AB兩個表格,其中A表格資料為1~4B表格為3~5,分別進行說明:
A
B
AB配對
N
1
2
3
4
N
3
4
5
A.N
B.N
1

2

3
3
4
4

5


UNION(聯集)
UNION ALL(聯集)
INTERSECT(交集)
EXCEPT(差集)
圖示
結果
N
1
2
3
4
5
N
1
2
3
4
3
4
5
N
3
4
N
1
2
說明
重複資料只顯示一次
AB資料中,兩者均有34UNION操作時,只保留一部分,另外重複部分將被剔除
所有資料都會顯示。不管是否重複。
前一項中所說因AB資料集中,兩者均有(3, 4)對於UNION ALL保留所有資料
只顯示重複(A U B 交集)共同擁有)資料,即AB交集部分。
A – A U B
差集是將A的資料但剔AB交集部分

對於如聯集(UNION)、聯集不剔除重複(UNION ALL)、交集(INTERSECT)、差集(MINUS)四種集合運算,ORACLE均支援;對於SQL SERVER 2000僅支援UNIONUNION ALL指令,SQL SERVER 2005以上版本(包含2008 )的集合運算更提供交集(INTERSECT)、差集(MINUS)運算指令,後續僅以SQL SERVER 2005代表20052008版本。


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
結果
COL
B
A
B
COL
A
B
Ü
1. 排序
2. 剔除重複『B

若要更清楚了解資料庫系統內部運作,可以試著觀察採用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中並無提供此種指定,可由前述定義需同時存在於AB此與表格內部結合(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
MSSQL2005ORACLE均使用INTERSECT指令

3.  差集(MINUS
MSSQL 2005(含)以上提供EXCEPT指令,此指令與ORACLEMINUS指令類似,第一個資料集與第二個資料集相比較,資料只存在於第一個資料集,但不存在於第二個資料集的值(即相減),以數學式來表示為:A – A U B,於A資料集中剔除與B交集的資料。其概念如下圖所示:

對於差集運算MSSQL2005()以上版本及ORACLE分別提供EXCEPTMINUS指令,語法如下:
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.  欄位型態需相容
資料型態相容是指同類型的資料型態,如CHARVARCHARNVARCHAR同屬字元型態,才准許進行集合(SET)運算。
3.  傳回結果集的欄位名稱是以第一個資料集為依據
4.  排序操作
需將ORDER BY子句置於整組SQL最後部分,排序可使用第一組資料集的欄位名稱,或使用欄位需欄位位置即數值。

沒有留言:

張貼留言