SQL Union
SQL UNION 和 UNION ALL 运算符:组合结果集
Section titled “SQL UNION 和 UNION ALL 运算符:组合结果集”SQL UNION 和 UNION ALL 运算符用于将两个或多个 SELECT 语句的结果集合并为一个结果集。
理解 UNION 和 UNION ALL
Section titled “理解 UNION 和 UNION ALL”UNION 运算符合并结果集并移除重复行。UNION ALL 运算符也合并结果集,但会包含所有行,包括重复行。
使用 UNION/UNION ALL 的关键规则:
- 列数相同:
UNION或UNION ALL中的每个SELECT语句在其选择列表中必须具有相同数量的列。 - 数据类型兼容: 每个
SELECT语句中对应列的数据类型必须兼容(例如,您可以联合一个VARCHAR和另一个VARCHAR,或者一个INT和另一个INT)。数据库会尝试隐式转换类型(如果可能),但最佳实践是确保它们匹配或直接兼容。 - 列顺序相同: 每个
SELECT语句中的列必须按照相同的顺序排列。
SQL UNION 语法
Section titled “SQL UNION 语法”SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2 ORDER BY column_name; — 可选:应用于最终合并的结果集
UNION 默认只选择不同值。
SQL UNION ALL 语法
Section titled “SQL UNION ALL 语法”SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2 ORDER BY column_name; — 可选:应用于最终合并的结果集
UNION ALL 选择所有值,包括重复项。它通常比 UNION 快,因为它不执行移除重复项的额外步骤。
列名:最终结果集中的列名通常取自第一个 SELECT 语句。
示例数据库:Northwind
Section titled “示例数据库:Northwind”我们将使用 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 UNION 示例:唯一城市
Section titled “SQL UNION 示例:唯一城市”以下 SQL 语句从 “Customers” 和 “Suppliers” 表中选择所有唯一的城市,并按字母顺序排序。
SELECT City FROM CustomersUNIONSELECT City FROM SuppliersORDER BY City;如果某个城市同时出现在两个表中(例如 London),它在结果中只会列出一次。
SQL UNION ALL 示例:所有城市(包括重复项)
Section titled “SQL UNION ALL 示例:所有城市(包括重复项)”以下 SQL 语句使用 UNION ALL 选择两个表中的所有城市。如果某个城市同时存在于两个表中,或在一个表中出现多次(如果我们没有先从每个表中选择唯一城市),它将在结果中多次出现。
SELECT City FROM CustomersUNION ALLSELECT City FROM SuppliersORDER BY City;SQL UNION ALL 带 WHERE 示例:合并过滤后的数据
Section titled “SQL UNION ALL 带 WHERE 示例:合并过滤后的数据”此示例选择 “Customers” 表中所有德国城市和 “Suppliers” 表中所有美国城市,并将它们合并到一个列表中。它还选择了国家/地区以作区分。
SELECT City, Country, 'Customer' AS EntityType FROM CustomersWHERE Country = 'Germany'UNION ALLSELECT City, Country, 'Supplier' AS EntityType FROM SuppliersWHERE Country = 'USA'ORDER BY Country, City;实际应用:UNION 和 UNION ALL 对于合并来自相似表的数据(例如 ActiveEmployees 和 ArchivedEmployees),或创建合并报告非常有用,特别是当数据来源共享相似结构时。