在 MySQL 中,UNION 是一个非常常用的查询关键字,主要用于合并多个 SELECT 查询的结果集。

很多初学者容易把 UNION 和 JOIN 混淆。简单来说:
UNION 是把结果上下拼接JOIN 是把表数据左右关联本文就来系统总结一下 MySQL 中 UNION 的基本用法、注意事项以及常见场景。
UNION 用于合并两个或多个 SELECT 语句的查询结果。
基本语法如下:
SELECT 列1, 列2 FROM 表AUNIONSELECT 列1, 列2 FROM 表B;
例如:
SELECT name, phone FROM customersUNIONSELECT name, phone FROM suppliers;
这条 SQL 的意思是:
从 customers 表和 suppliers 表中分别查询 name 和 phone 字段,然后把两个查询结果合并成一个结果集。
在 MySQL 中,UNION 默认会去掉重复的数据行。
例如:
SELECT 1 AS idUNIONSELECT 1 AS id;
查询结果为:
id--1
虽然两个查询都返回了 1,但是最终结果中只保留了一行。
也就是说:
UNION
等价于:
UNION DISTINCT
默认行为就是去重。
如果希望保留所有查询结果,包括重复数据,可以使用 UNION ALL。
例如:
SELECT 1 AS idUNION ALLSELECT 1 AS id;
查询结果为:
id
--
可以看到,两条重复的数据都被保留下来了。
在实际开发中,如果你确定数据不会重复,或者业务上允许重复,建议优先使用 UNION ALL。
原因是:
UNION ALL 不需要进行去重操作,性能通常比 UNION 更好。
使用 UNION 时,需要注意几个基本规则。
正确写法:
SELECT id, name FROM usersUNIONSELECT id, name FROM admins;
错误写法:
SELECT id, name FROM usersUNIONSELECT id FROM admins;
第一个查询返回两列,第二个查询只返回一列,列数不一致,MySQL 无法合并结果。
例如:
SELECT id, name FROM usersUNIONSELECT id, title FROM articles;
这条 SQL 在语法上可能没有问题,因为两个查询都返回两列。
但是从业务含义上看,第二列一边是用户名 name,一边是文章标题 title,语义可能并不统一。
因此,在使用 UNION 时,不仅要保证列数一致,也要尽量保证对应列的数据含义一致。
例如:
SELECT id AS user_id, name AS user_name FROM usersUNIONSELECT id AS admin_id, name AS admin_name FROM admins;
最终结果中的列名是:
user_id | user_name
而不是:
admin_id | admin_name
也就是说,UNION 最终结果集的字段名由第一个 SELECT 决定。
如果想对合并后的最终结果排序,可以把 ORDER BY 写在最后。
例如:
SELECT id, name FROM usersUNION ALLSELECT id, name FROM adminsORDER BY id DESC;
这里的 ORDER BY id DESC 是对两个查询合并之后的整体结果进行排序。
如果想让每个查询内部先排序或限制条数,可以使用括号。
例如:
(SELECT id, name FROM users ORDER BY id DESC LIMIT 10)UNION ALL(SELECT id, name FROM admins ORDER BY id DESC LIMIT 10)ORDER BY id DESC;
这条 SQL 的含义是:
users 表中取 id 最大的 10 条数据;admins 表中取 id 最大的 10 条数据;id 倒序排序。假设有两张学生表:
students_2024students_2025
现在想把两个年份的学生数据合并查询出来,可以这样写:
SELECT id, name, '2024' AS year FROM students_2024UNION ALLSELECT id, name, '2025' AS year FROM students_2025;
这里额外加了一个固定字段:
'2024' AS year
和:
'2025' AS year
这样可以清楚地知道每一行数据来自哪一年。
查询结果可能类似:
id | name | year
---|------|------
1 | 张三 | 2024
2 | 李四 | 2024
1 | 王五 | 2025
2 | 赵六 | 2025
这种写法在分表查询、历史数据合并、报表统计中都很常见。
很多人刚学 SQL 时,会把 UNION 和 JOIN 混淆。
它们的区别其实很简单。
SELECT name FROM customersUNIONSELECT name FROM suppliers;
可以理解为:
customers 查询结果
+
suppliers 查询结果
它是把多批结果合并成更多行。
SELECT orders.id, users.nameFROM ordersJOIN users ON orders.user_id = users.id;
可以理解为:
订单信息 + 用户信息
它是根据关联条件,把多张表的数据拼接到同一行中。
一般可以按照下面的原则选择:
如果需要去重,使用:
UNION
如果不需要去重,使用:
UNION ALL
在实际项目中,UNION ALL 的使用频率通常更高,因为它不会进行去重处理,性能相对更好。
只有在确实需要去除重复数据时,才使用 UNION。
本文主要介绍了 MySQL 中 UNION 的用法。
总结一下:
UNION 用于合并多个 SELECT 查询结果;UNION 默认会去除重复行;UNION ALL 不会去重,性能通常更好;SELECT 的列数必须一致;SELECT 决定;ORDER BY 写在最后时,是对整个合并结果排序;UNION 是上下拼接,JOIN 是左右关联。一句话记忆:
UNION 合并结果并去重,UNION ALL 合并结果不去重;列数要一致,类型要兼容,字段名看第一个 SELECT。