Skip to content

SQL Union

SQL UNION 和 UNION ALL 运算符:组合结果集

Section titled “SQL UNION 和 UNION ALL 运算符:组合结果集”

SQL UNION 和 UNION ALL 运算符用于将两个或多个 SELECT 语句的结果集合并为一个结果集。

UNION 运算符合并结果集并移除重复行。UNION ALL 运算符也合并结果集,但会包含所有行,包括重复行。

使用 UNION/UNION ALL 的关键规则:

  1. 列数相同: UNION 或 UNION ALL 中的每个 SELECT 语句在其选择列表中必须具有相同数量的列。
  2. 数据类型兼容: 每个 SELECT 语句中对应列的数据类型必须兼容(例如,您可以联合一个 VARCHAR 和另一个 VARCHAR,或者一个 INT 和另一个 INT)。数据库会尝试隐式转换类型(如果可能),但最佳实践是确保它们匹配或直接兼容。
  3. 列顺序相同: 每个 SELECT 语句中的列必须按照相同的顺序排列。

SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2 ORDER BY column_name; — 可选:应用于最终合并的结果集

UNION 默认只选择不同值。

SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2 ORDER BY column_name; — 可选:应用于最终合并的结果集

UNION ALL 选择所有值,包括重复项。它通常比 UNION 快,因为它不执行移除重复项的额外步骤。

列名:最终结果集中的列名通常取自第一个 SELECT 语句。

我们将使用 Northwind 数据库中 “Customers” 和 “Suppliers” 表的数据。

“Customers” 表的示例数据:

CustomerID CustomerName ContactName Address City PostalCode Country

1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany

2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico

3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico

“Suppliers” 表的示例数据:

SupplierID SupplierName ContactName Address City PostalCode Country

1 Exotic Liquids Charlotte Cooper 49 Gilbert St. London EC1 4SD UK

2 New Orleans Cajun Delights Shelley Burke P.O. Box 78934 New Orleans 70117 USA

3 Grandma Kelly’s Homestead Regina Murphy 707 Oxford Rd. Ann Arbor 48104 USA

以下 SQL 语句从 “Customers” 和 “Suppliers” 表中选择所有唯一的城市,并按字母顺序排序。

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;

如果某个城市同时出现在两个表中(例如 London),它在结果中只会列出一次。

SQL UNION ALL 示例:所有城市(包括重复项)

Section titled “SQL UNION ALL 示例:所有城市(包括重复项)”

以下 SQL 语句使用 UNION ALL 选择两个表中的所有城市。如果某个城市同时存在于两个表中,或在一个表中出现多次(如果我们没有先从每个表中选择唯一城市),它将在结果中多次出现。

SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;

SQL UNION ALL 带 WHERE 示例:合并过滤后的数据

Section titled “SQL UNION ALL 带 WHERE 示例:合并过滤后的数据”

此示例选择 “Customers” 表中所有德国城市和 “Suppliers” 表中所有美国城市,并将它们合并到一个列表中。它还选择了国家/地区以作区分。

SELECT City, Country, 'Customer' AS EntityType FROM Customers
WHERE Country = 'Germany'
UNION ALL
SELECT City, Country, 'Supplier' AS EntityType FROM Suppliers
WHERE Country = 'USA'
ORDER BY Country, City;

实际应用:UNION 和 UNION ALL 对于合并来自相似表的数据(例如 ActiveEmployees 和 ArchivedEmployees),或创建合并报告非常有用,特别是当数据来源共享相似结构时。