在本章中,我们将深入探讨 SQL 中的 UNION 操作符。UNION 是一种非常有用的工具,可以将多个 SELECT 语句的结果集合并成一个单一的结果集。这种操作对于数据整合和分析特别有用。
UNION 基础
什么是 UNION?
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。需要注意的是,UNION 内部的每个 SELECT 语句必须拥有相同数量的列,并且这些列应该具有相似的数据类型。此外,每个 SELECT 语句中的列也必须以相同的顺序出现。
UNION 和 UNION ALL 的区别
UNION 操作符默认会去除重复的行。如果你想要保留所有行,包括重复的行,你需要使用 UNION ALL。UNION ALL 通常比 UNION 更快,因为它不需要检查重复项。
示例
假设我们有两个表 employees
和 freelancers
,它们都有一些共同的字段:id
, name
, position
, salary
。我们可以使用 UNION 来获取所有员工和自由职业者的列表:
SELECT id, name, position, salary FROM employees UNION SELECT id, name, position, salary FROM freelancers;
如果希望保留所有条目,即使有重复的条目,可以使用 UNION ALL:
SELECT id, name, position, salary FROM employees UNION ALL SELECT id, name, position, salary FROM freelancers;
使用 UNION 处理不同类型的数据
虽然 UNION 要求结果集的列数和数据类型相同,但有时我们需要处理不同类型的数据。在这种情况下,我们可以使用一些技巧来确保数据类型的一致性。
类型转换
如果两个 SELECT 语句返回不同类型的列,可以通过类型转换使它们兼容。例如,如果我们有一个表中的 salary
字段是整数类型,而另一个表中的 salary
字段是字符串类型,我们可以使用 CAST()
或者 CONVERT()
函数进行类型转换。
SELECT id, name, position, CAST(salary AS INT) AS salary FROM employees UNION SELECT id, name, position, CONVERT(INT, salary) AS salary FROM freelancers;
示例:处理不同类型的数据
假设我们有两个表 sales
和 returns
,它们分别记录了销售和退货的信息。sales
表中有 amount
字段,而 returns
表中有 return_amount
字段。我们希望合并这两个表的数据:
SELECT 'sale' AS type, id, amount AS total FROM sales UNION SELECT 'return' AS type, id, -1 * return_amount AS total FROM returns;
在这个例子中,我们通过添加一个额外的列 type
来区分销售和退货,并且通过乘以 -1
将退货金额转换为负值,以便统一表示。
UNION 在复杂查询中的应用
分组和聚合
UNION 可以与 GROUP BY 和聚合函数一起使用,以生成复杂的报告或统计信息。例如,我们可以计算某个时间段内的总销售额和退货额。
SELECT SUM(amount) AS total FROM sales WHERE date BETWEEN '2023-01-01' AND '2023-01-31' UNION SELECT SUM(-1 * return_amount) AS total FROM returns WHERE date BETWEEN '2023-01-01' AND '2023-01-31';
示例:结合分组和聚合
假设我们有两个表 orders
和 cancellations
,分别记录了订单和取消订单的信息。我们希望计算每个客户的总订单金额和取消金额:
SELECT customer_id, SUM(order_total) AS total FROM orders GROUP BY customer_id UNION SELECT customer_id, SUM(-1 * cancellation_total) AS total FROM cancellations GROUP BY customer_id;
这个查询首先计算每个客户的所有订单总额,然后计算所有取消订单的总额(作为负值),最后将两者合并。
总结
本章详细介绍了 SQL 中的 UNION 操作符及其用途。我们讨论了如何使用 UNION 合并结果集、处理不同类型的数据以及在复杂查询中的应用。掌握 UNION 对于高效地整合和分析数据至关重要。接下来的章节将继续深入探讨 SQL 的其他重要概念和操作符。