在本教學中,將學習如何使用SQL Server UNION
將兩個或多個查詢的結果合併到一個結果集中。
SQL Server UNION簡介
SQL Server UNION
是一組集合操作,用於將兩個SELECT語句的結果組合到一個結果集中,該結果集包括屬於union
中SELECT
語句的所有行。
以下是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 JOIN或LEFT JOIN等連接組合了兩個表中的列,而UNION
組合了兩個查詢中的行。
換句話說,join
會水準附加結果集,而union
會垂直附加結果集。
下圖說明瞭UNION
和JOIN
之間的主要區別:
SQL Server UNION示例
請參閱示例資料庫中的staff
和customers
表,它們的結構和關係如下所示:
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;
執行上面查詢語句,得到以下結果:
查詢按預期返回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;
執行上面查詢語句,得到以下結果: