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)
相关推荐
会飞的土拨鼠呀15 分钟前
如何查询MySQL的CPU使用率突然变高
数据库·mysql
想用offer打牌23 分钟前
一站式了解数据库三大范式(库表设计基础)
数据库·后端·面试
甘露s25 分钟前
MySQL深入之索引、存储引擎和SQL优化
数据库·sql·mysql
偶遇急雨洗心尘1 小时前
记录一次服务器迁移时,数据库版本不一致导致sql函数报错和系统redirect重定向丢失域名问题
运维·服务器·数据库·sql
Arva .1 小时前
MySQL 的存储引擎
数据库·mysql
Logic1011 小时前
《Mysql数据库应用》 第2版 郭文明 实验5 存储过程与函数的构建与使用核心操作与思路解析
数据库·sql·mysql·学习笔记·计算机网络技术·形考作业·国家开放大学
小二·2 小时前
MyBatis基础入门《十六》企业级插件实战:基于 MyBatis Interceptor 实现 SQL 审计、慢查询监控与数据脱敏
数据库·sql·mybatis
bing.shao2 小时前
Golang WaitGroup 踩坑
开发语言·数据库·golang
专注VB编程开发20年2 小时前
C#内存加载dll和EXE是不是差不多,主要是EXE有入口点
数据库·windows·microsoft·c#
小二·2 小时前
MyBatis基础入门《十二》批量操作优化:高效插入/更新万级数据,告别慢 SQL!
数据库·sql·mybatis