mysql学习教程,从入门到精通,SQL UNION 运算符(27)

1、SQL UNION 运算符

UNION 运算符在 SQL 中用于合并两个或多个 SELECT 语句的结果集,并默认去除重复的行。如果你想要包含所有重复行,可以使用 UNION ALL。下面是一个使用 UNION 运算符的示例,假设我们有两个表:employees_2020employees_2021,它们存储了不同年份的员工信息,每个表都有 employee_id(员工ID)和 employee_name(员工姓名)两个字段。

1.1、示例场景

我们想要查询 2020 年和 2021 年所有员工的姓名,但不希望结果中出现重复的员工姓名。

表结构

employees_2020

employee_id employee_name
1 Alice
2 Bob
3 Charlie

employees_2021

employee_id employee_name
2 Bob
3 Charlie
4 David

1.2、SQL 查询

sql 复制代码
SELECT employee_name
FROM employees_2020
UNION
SELECT employee_name
FROM employees_2021;

结果

employee_name
Alice
Bob
Charlie
David

解释

这个查询通过 UNION 合并了两个 SELECT 语句的结果集:第一个从 employees_2020 表中选择 employee_name,第二个从 employees_2021 表中选择 employee_name。由于 UNION 默认去除重复行,所以尽管 BobCharlie 在两个表中都出现,但在最终的结果集中只出现一次。

注意

  • 如果你的目的是包含所有重复行,应使用 UNION ALL 替代 UNION
  • UNION 要求每个 SELECT 语句中的列数必须相同,并且对应列的数据类型也需要兼容。
  • 在使用 UNION 时,默认情况下,SQL 会对结果集进行排序以去除重复项,这可能会影响查询性能。如果不需要排序或去重,使用 UNION ALL 可以提高性能。
  • 可以在 UNIONUNION ALL 后添加 ORDER BY 语句来对最终结果集进行排序。但请注意,ORDER BY 语句应放在最后一个 SELECT 语句之后,并且对所有合并后的列都有效。
    UNION 运算符在 SQL 中有广泛的用途,主要用于合并两个或多个 SELECT 语句的结果集。以下是一些常见的用途和例子:

1. 3、合并来自不同表的数据

这是 UNION 最直接的用途。当你想要从两个或多个具有相似结构(即列数相同且对应列的数据类型兼容)的表中检索数据时,可以使用 UNION 来合并这些表的结果。
例子

假设有两个表,sales_2020sales_2021,分别记录了 2020 年和 2021 年的销售数据,每个表都有 product_idsales_amount 字段。

sql 复制代码
SELECT product_id, sales_amount
FROM sales_2020
UNION
SELECT product_id, sales_amount
FROM sales_2021;

这个查询将返回 2020 年和 2021 年所有产品的销售金额,但不包括重复的产品(如果某个产品在两年中都有销售记录,则只会出现一次)。

1.4. 合并具有不同条件的查询结果

有时,你可能想要从同一个表中检索数据,但基于不同的条件。使用 UNION 可以将这些基于不同条件的查询结果合并为一个结果集。
例子

假设有一个 employees 表,包含员工的姓名(name)和部门(department)信息。你想要检索所有在"销售"部门或"市场"部门的员工姓名。

sql 复制代码
SELECT name
FROM employees
WHERE department = '销售'
UNION
SELECT name
FROM employees
WHERE department = '市场';

3. 跨数据库合并数据

虽然 UNION 本身是在单个数据库查询中使用的,但你可以通过数据库链接(如 Oracle 的数据库链接或 SQL Server 的链接服务器)来跨数据库合并数据。这通常涉及到更复杂的查询,但基本思想是相同的:从不同的数据源检索数据,并使用 UNION(或 UNION ALL)来合并结果。

4. 报告和数据分析

在生成报告或进行数据分析时,经常需要合并来自不同表或不同查询的数据集。UNION 允许你将这些数据集合并为一个,便于进一步的分析或报告生成。

5. 去除重复数据

虽然 UNION 的主要目的不是专门为了去除重复数据(因为那是它的默认行为),但在某些情况下,这正是你想要的。如果你想要从多个表中检索数据,并且只关心唯一的记录,那么 UNION 是一个很好的选择。

注意事项

  • 当使用 UNION 时,每个 SELECT 语句中的列数必须相同,并且对应列的数据类型也需要兼容。
  • UNION 默认去除重复的行。如果你想要包含所有重复的行,应该使用 UNION ALL
  • 可以在 UNIONUNION ALL 后面添加 ORDER BY 语句来对最终结果集进行排序,但 ORDER BY 必须位于最后一个 SELECT 语句之后。
  • 在某些情况下,使用 JOIN 而不是 UNION 可能更合适,特别是当你想要根据两个表之间的关系来合并数据时。然而,JOINUNION 在用途上是不同的,JOIN 用于基于相关列合并行的数据,而 UNION 用于合并不同的结果集。
相关推荐
时光の尘几秒前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-10 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
statistican_ABin13 分钟前
R语言数据分析案例45-全国汽车销售数据分析(可视化与回归分析)
数据挖掘·数据分析
以后不吃煲仔饭15 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
soso196815 分钟前
DataWorks快速入门
大数据·数据仓库·信息可视化
进阶的架构师15 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者19 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
The_Ticker21 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
程序猿阿伟21 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
java1234_小锋26 分钟前
Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?
大数据·elasticsearch·jenkins