在本教學中,您將學習如何使用Oracle UNION
運算子來組合由兩個或多個查詢返回的結果集。
UNION
運算子是一個集合運算子,它將兩個或多個SELECT語句的結果集組合到一個結果集中。
以下說明了組合兩個查詢的結果集的UNION
運算子的語法:
SELECT
column_list_1
FROM
T1
UNION
SELECT
column_list_1
FROM
T2;
在此宣告中,column_list_1
和column_list_2
必須具有相同順序的相同列數。 另外,對應列的資料型別必須是相同的資料型別組,例如數位或字元。
SELECT
column_list
FROM
T1
UNION ALL
SELECT
column_list
FROM
T2;
Oracle UNION圖示
假設有兩個表 - T1
和T2
:
T1
有三行:1
,2
和3
T2
也有三行:2
,3
和4
下圖說明了T1
和T2
表的UNION
運算圖示:
UNION
運算子刪除(消除)重複的行 - 2
和3
下圖顯示了UNION ALL
運算子T1
和T2
表的結果:
正如上面所看到的,UNION ALL
保留了重複的行 - 2
和3
。
請參閱範例資料庫中的以下employees
表和contacts
表的ER圖結構。
假設,需要傳送電子郵件到員工和聯絡人表的電子郵件地址。 要做到這一點,首先,需要撰寫員工和聯絡人的電子郵件地址列表。然後傳送電子郵件到列表中。
以下語句使用UNION
運算子來構建員工和聯絡人表中的聯絡人列表:
SELECT
first_name,
last_name,
email,
'contact'
FROM
contacts
UNION SELECT
first_name,
last_name,
email,
'employee'
FROM
employees;
執行上面查詢語句,得到以下結果 -
要對由UNION運算子返回的結果集進行排序,可以將ORDER BY子句新增到最後一個SELECT
語句中,如下所示:
SELECT
first_name || ' ' || last_name name,
email,
'contact'
FROM
contacts
UNION SELECT
first_name || ' ' || last_name name,
email,
'employee'
FROM
employees
ORDER BY
name DESC;
在這個例子中,將first_name
和last_name
連線起來,並使用一個別名:name
,結果按name
列排序。
執行上面查詢程式碼,得到以下結果 -
以下語句返回員工和聯絡人的唯一姓氏(last_name
):
SELECT
last_name
FROM
employees
UNION SELECT
last_name
FROM
contacts
ORDER BY
last_name;
該查詢返回了357
個唯一的姓氏(last_name
)值。參考下面結果 -
但是,如果在查詢中使用UNION ALL
而不是UNION
,如下所示:
SELECT
last_name
FROM
employees
UNION ALL SELECT
last_name
FROM
contacts
ORDER BY
last_name;
該查詢返回426
行。 另外,一些行是重複的,例如,Atkinson
, Barnett
。 這是因為UNION ALL
操作符不會刪除重複的行。
UNION
將結果集放置在另一個上面,這意味著它將垂直地附加結果集。但是,諸如INNER JOIN或LEFT JOIN的連線將結果集水平組合。
下圖說明了union
和join
的區別:
在本教學中,您已經學習了如何使用Oracle UNION
運算子來組合多個查詢的結果集。