SQL Server Union(並集)運算符

在本教學中,將學習如何使用SQL Server UNION將兩個或多個查詢的結果合併到一個結果集中。

SQL Server UNION簡介

SQL Server UNION是一組集合操作,用於將兩個SELECT語句的結果組合到一個結果集中,該結果集包括屬於unionSELECT語句的所有行。

以下是SQL Server UNION的語法:

query_1
UNION
query_2

以下是上述語法中的查詢要求:

  • 兩個查詢中列的數量和順序必須相同。
  • 相應列的數據類型必須相同或相容。

下麵圖中說明了T1表的結果集如何與T2表的結果集聯合:

聯合

UNION 與 UNION ALL

默認情況下,UNION運算符從結果集中刪除所有重複的行。 但是,如果要保留重複的行,則需要明確指定ALL關鍵字,如下所示:

query_1
UNION ALL
query_2

換句話說,UNION運算符刪除重複行,而UNION ALL運算符在最終結果集中包含重複行。

UNION 與 JOIN

INNER JOINLEFT JOIN等連接組合了兩個表中的列,而UNION組合了兩個查詢中的行。

換句話說,join會水準附加結果集,而union會垂直附加結果集。

下圖說明瞭UNIONJOIN之間的主要區別:
UNION與JOIN主要區別

SQL Server UNION示例

請參閱示例資料庫中的staffcustomers表,它們的結構和關係如下所示:

表結構

1. UNION和UNION ALL示例

以下示例將員工和客戶的名稱合併到一個列表中:

SELECT
    first_name,
    last_name
FROM
    sales.staffs
UNION
SELECT
    first_name,
    last_name
FROM
    sales.customers;

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

如上圖中,它返回了1454行。

staffs表有10行,customers表有1445行,如以下查詢說明所示:

SELECT
    COUNT (*)
FROM
    sales.staffs;
-- 10

SELECT
    COUNT (*)
FROM
    sales.customers;
-- 1454

因為union的結果集只返回1454行,這意味著刪除了一個重複行。要包含重複行,請使用UNION ALL,如以下查詢中所示:

SELECT
    first_name,
    last_name
FROM
    sales.staffs
UNION ALL
SELECT
    first_name,
    last_name
FROM
    sales.customers;

執行上面查詢語句,得到以下結果:
UNION ALL

查詢按預期返回1455行。

2. UNION和ORDER BY示例

要對UNION運算符返回的結果集進行排序,請將ORDER BY子句放在最後一個查詢中,如下所示:

SELECT
    select_list
FROM
    table_1
UNION
SELECT
    select_list
FROM
    table_2
ORDER BY
    order_list;

例如,要對客戶和員工的名字(first_name)和姓氏(last_name)進行排序,請使用以下查詢語句:

SELECT
    first_name,
    last_name
FROM
    sales.staffs
UNION ALL
SELECT
    first_name,
    last_name
FROM
    sales.customers
ORDER BY
    first_name,
    last_name;

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

排序


上一篇: SQL Server集合操作符 下一篇: SQL Server約束