在数据库查询中,UNION 和 UNION ALL 是两个非常重要的 SQL 运算符,用于合并多个 SELECT 查询的结果集。它们能够将来自不同表或查询的结果组合在一起,形成一个统一的结果集。尽管两者都用于合并查询结果,但它们之间存在显著差异。本文将详细介绍 UNION 和 UNION ALL 的用法、特点以及它们之间的区别,并通过实例演示如何在实际场景中应用这些运算符。
UNION
UNION 是 SQL 中的一个集合运算符,用于将两个或多个 SELECT 查询的结果合并为一个结果集。合并后的结果集会自动去除重复的行。换句话说,UNION 会对所有查询返回的结果进行去重处理。
UNION ALL
UNION ALL 与 UNION 类似,用于将多个 SELECT 查询的结果合并为一个结果集。然而,与 UNION 不同的是,UNION ALL 不会对结果进行去重处理,而是直接将所有查询返回的结果合并在一起。
UNION 语法
UNION 的基本语法如下:
SELECT column_list FROM table1
UNION
SELECT column_list FROM table2;
UNION ALL 语法
UNION ALL 的基本语法如下:
SELECT column_list FROM table1
UNION ALL
SELECT column_list FROM table2;
注意事项
列数匹配:UNION 和 UNION ALL 的查询必须具有相同数量的列。
列类型兼容:列的数据类型必须兼容,否则可能导致错误。
排序字段:如果需要对合并后的结果进行排序,可以在最后使用 ORDER BY 子句。
数据去重
这是 UNION 和 UNION ALL 最大的区别之一。UNION 会对合并后的结果进行去重处理,而 UNION ALL 不会。
示例 1:UNION 去重
假设我们有两个表 table1 和 table2,它们的结构如下:
id name
1 Alice
2 Bob
id name
2 Bob
3 Carol
执行以下查询:
SELECT id, name FROM table1
UNION
SELECT id, name FROM table2;
结果为:
id name
1 Alice
2 Bob
3 Carol
可以看到,UNION 去除了重复的行(id=2, name='Bob')。
示例 2:UNION ALL 不去重
执行以下查询:
SELECT id, name FROM table1
UNION ALL
SELECT id, name FROM table2;
结果为:
id name
1 Alice
2 Bob
2 Bob
3 Carol
可以看到,UNION ALL 保留了所有重复的行。
性能差异
由于 UNION 需要对结果进行去重处理,因此它的性能通常低于 UNION ALL。去重操作需要额外的时间和资源,尤其是在处理大规模数据时,这种差异会更加明显。
示例 3:性能对比
假设我们有一个包含 100 万条记录的表 large_table,执行以下查询:
-- 使用 UNION ALL
SELECT id FROM large_table
UNION ALL
SELECT id FROM large_table;
-- 使用 UNION
SELECT id FROM large_table
UNION
SELECT id FROM large_table;
在大多数情况下,UNION ALL 的执行时间会比 UNION 更短,因为它不需要进行去重操作。
应用场景
UNION:适用于需要合并结果但不允许重复数据的场景。例如,从多个表中提取唯一的数据。
UNION ALL:适用于需要合并结果且允许重复数据的场景。例如,统计某段时间内的销售数据,其中可能存在重复订单。
条件过滤
在使用 UNION 或 UNION ALL 时,可以通过 WHERE 子句对每个查询的结果进行条件过滤。
示例 4:条件过滤
假设我们有两个表 orders 和 returns,分别存储订单和退货信息。执行以下查询:
SELECT order_id, 'Order' AS type FROM orders
UNION ALL
SELECT return_id, 'Return' AS type FROM returns;
结果为:
order_idtype
101 Order
102 Order
201 Return
排序
可以通过 ORDER BY 子句对合并后的结果进行排序。
示例 5:排序
执行以下查询:
SELECT order_id, 'Order' AS type FROM orders
UNION ALL
SELECT return_id, 'Return' AS type FROM returns
ORDER BY order_id;
结果为:
order_idtype
101 Order
102 Order
201 Return
聚合函数
可以结合聚合函数(如 COUNT、SUM 等)对合并后的结果进行进一步处理。
示例 6:聚合函数
执行以下查询:
SELECT COUNT(*) AS total_orders FROM orders
UNION ALL
SELECT COUNT(*) AS total_returns FROM returns;
结果为:
total_orders
100
20
忽略列名
在使用 UNION 或 UNION ALL 时,必须确保两个查询的列名一致。如果列名不一致,MySQL 会使用第一个查询的列名作为结果集的列名。
示例 7:列名不一致
执行以下查询:
SELECT id, name FROM table1
UNION ALL
SELECT id, full_name FROM table2;
结果的列名为:
| id | name |
忽略 NULL 值
在合并结果时,如果某个查询返回的列包含 NULL 值,UNION 和 UNION ALL 都会保留这些 NULL 值。
示例 8:NULL 值处理
执行以下查询:
SELECT id, name FROM table1
UNION ALL
SELECT id, NULL FROM table2;
结果为:
id name
1 Alice
2 NULL
UNION 和 UNION ALL 是 MySQL 中两个非常实用的集合运算符,用于合并多个 SELECT 查询的结果集。UNION 会对结果进行去重处理,而 UNION ALL 则保留所有重复行。两者各有优缺点,选择时需根据具体需求权衡性能和去重需求。
声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com