Oracle Union運算子


在本教學中,您將學習如何使用Oracle UNION運算子來組合由兩個或多個查詢返回的結果集。

Oracle UNION運算子簡介

UNION運算子是一個集合運算子,它將兩個或多個SELECT語句的結果集組合到一個結果集中。

以下說明了組合兩個查詢的結果集的UNION運算子的語法:

SELECT
    column_list_1
FROM
    T1
UNION 
SELECT
    column_list_1
FROM
    T2;

在此宣告中,column_list_1column_list_2必須具有相同順序的相同列數。 另外,對應列的資料型別必須是相同的資料型別組,例如數位字元

SELECT
    column_list
FROM
    T1
UNION ALL 
SELECT
    column_list
FROM
    T2;

Oracle UNION圖示

假設有兩個表 - T1T2

  • T1有三行:1,23
  • T2也有三行:2,34

下圖說明了T1T2表的UNION運算圖示:

UNION運算子刪除(消除)重複的行 - 23

下圖顯示了UNION ALL運算子T1T2表的結果:

正如上面所看到的,UNION ALL保留了重複的行 - 23

Oracle UNION範例

請參閱範例資料庫中的以下employees表和contacts表的ER圖結構。

Oracle UNION範例1

假設,需要傳送電子郵件到員工和聯絡人表的電子郵件地址。 要做到這一點,首先,需要撰寫員工和聯絡人的電子郵件地址列表。然後傳送電子郵件到列表中。

以下語句使用UNION運算子來構建員工和聯絡人表中的聯絡人列表:

SELECT
    first_name,
    last_name,
    email,
    'contact'
FROM
    contacts
UNION SELECT
    first_name,
    last_name,
    email,
    'employee'
FROM
    employees;

執行上面查詢語句,得到以下結果 -

2. Oracle UNION和ORDER BY範例

要對由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_namelast_name連線起來,並使用一個別名:name,結果按name列排序。
執行上面查詢程式碼,得到以下結果 -

3. Oracle UNION ALL範例

以下語句返回員工和聯絡人的唯一姓氏(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操作符不會刪除重複的行。

Oracle UNION 與 JOIN 區別

UNION將結果集放置在另一個上面,這意味著它將垂直地附加結果集。但是,諸如INNER JOINLEFT JOIN的連線將結果集水平組合。

下圖說明了unionjoin的區別:

在本教學中,您已經學習了如何使用Oracle UNION運算子來組合多個查詢的結果集。