SQL关键字三分钟入门:UNION 与 UNION ALL —— 数据合并全攻略

在处理数据时,有时我们需要将来自不同表或同一表的不同查询结果合并在一起。例如:

  • 合并两个部门的员工名单;
  • 将多个地区的销售数据汇总;
  • 显示某段时间内所有新增和修改的记录。

这时候,我们就需要用到 SQL 中非常强大的两个关键字 ------ UNIONUNION ALL

它们可以帮助我们轻松地将多个查询结果集合并为一个结果集,但两者之间有一些关键的区别需要注意。


一、什么是 UNION 和 UNION ALL?

  • UNION :用于合并两个或多个 SELECT 语句的结果集,并自动去除重复行。
  • UNION ALL :也用于合并两个或多个 SELECT 语句的结果集,但它不会去除重复行。

你可以把它们理解为:"将不同的查询结果合并成一个大集合"。


二、基本语法

sql 复制代码
SELECT column1, column2, ...
FROM table1
UNION [ALL]
SELECT column1, column2, ...
FROM table2;
  • 必须保证每个 SELECT 语句中的列数相同,且对应列的数据类型兼容。
  • UNION 默认会去除重复行,而 UNION ALL 则保留所有行。

三、示例讲解

假设我们有两个表:employees_northemployees_south,分别存储了北部和南部地区员工的信息。

表:employees_north

id name
1 张三
2 李四

表:employees_south

id name
3 王五
4 李四

示例1:使用 UNION 合并两个表的数据(去重)

sql 复制代码
SELECT name FROM employees_north
UNION
SELECT name FROM employees_south;
结果:
name
张三
李四
王五

这里使用 UNION 自动去除了重复的名字"李四"。


示例2:使用 UNION ALL 保留所有数据(含重复)

sql 复制代码
SELECT name FROM employees_north
UNION ALL
SELECT name FROM employees_south;
结果:
name
张三
李四
王五
李四

这里使用 UNION ALL 保留了所有的记录,包括重复的名字"李四"。


示例3:结合 WHERE 和 ORDER BY 使用

sql 复制代码
-- 查找名字以"张"开头的所有员工,并按名字排序
(SELECT name FROM employees_north WHERE name LIKE '张%')
UNION
(SELECT name FROM employees_south WHERE name LIKE '张%')
ORDER BY name;
结果:
name
张三

先筛选出符合条件的记录,再进行合并并排序。


示例4:多列合并(注意列数和顺序一致性)

假设我们有两张表 orders_2024orders_2025,结构如下:

表:orders_2024
order_id product amount
1 手机 2999
2 耳机 499
表:orders_2025
order_id product amount
3 鼠标 199
4 键盘 399
sql 复制代码
SELECT * FROM orders_2024
UNION ALL
SELECT * FROM orders_2025;
结果:
order_id product amount
1 手机 2999
2 耳机 499
3 鼠标 199
4 键盘 399

注意:UNIONUNION ALL 合并时,必须确保每个 SELECT 语句返回的列数一致,并且对应的列类型兼容。


注意

对比项 UNION UNION ALL
是否去重
性能 较慢(需要额外的去重操作) 更快
使用场景 当你需要唯一值时 当你不介意重复值时

⚠️ 注意:使用 UNION 时,数据库需要对结果集进行排序和去重,这可能会消耗更多资源。如果不需要去重,建议优先使用 UNION ALL 提高性能。


四、总结对比表

场景 SQL 示例
合并两表数据(去重) SELECT name FROM table1 UNION SELECT name FROM table2;
合并两表数据(含重复) SELECT name FROM table1 UNION ALL SELECT name FROM table2;
多列合并 SELECT col1, col2 FROM table1 UNION ALL SELECT col1, col2 FROM table2;
结合筛选条件 (SELECT name FROM table1 WHERE condition) UNION (SELECT name FROM table2 WHERE condition)
相关推荐
风哥2号6 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
YangYang9YangYan7 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技8 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m8 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
风哥2号10 小时前
数据库教程FGMT43‑MySQL性能分析与优化调整
数据库·mysql
随身数智备忘录10 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶12 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea12 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
probex_13 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库
Patrick在香港13 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据