MySQL 中 UNION 的用法详解
作者:jianjinwssy
在 MySQL 中,UNION 是一个非常常用的查询关键字,主要用于合并多个 SELECT 查询的结果集。
很多初学者容易把 UNION 和 JOIN 混淆。简单来说:
UNION是把结果上下拼接JOIN是把表数据左右关联
本文就来系统总结一下 MySQL 中 UNION 的基本用法、注意事项以及常见场景。
一、UNION 是什么?
UNION 用于合并两个或多个 SELECT 语句的查询结果。
基本语法如下:
SELECT 列1, 列2 FROM 表A UNION SELECT 列1, 列2 FROM 表B;
例如:
SELECT name, phone FROM customers UNION SELECT name, phone FROM suppliers;
这条 SQL 的意思是:
从 customers 表和 suppliers 表中分别查询 name 和 phone 字段,然后把两个查询结果合并成一个结果集。
二、UNION 默认会去重
在 MySQL 中,UNION 默认会去掉重复的数据行。
例如:
SELECT 1 AS id UNION SELECT 1 AS id;
查询结果为:
id -- 1
虽然两个查询都返回了 1,但是最终结果中只保留了一行。
也就是说:
UNION
等价于:
UNION DISTINCT
默认行为就是去重。
三、UNION ALL 不会去重
如果希望保留所有查询结果,包括重复数据,可以使用 UNION ALL。
例如:
SELECT 1 AS id UNION ALL SELECT 1 AS id;
查询结果为:
id
--
1
1
可以看到,两条重复的数据都被保留下来了。
在实际开发中,如果你确定数据不会重复,或者业务上允许重复,建议优先使用 UNION ALL。
原因是:UNION ALL 不需要进行去重操作,性能通常比 UNION 更好。
四、UNION 的使用要求
使用 UNION 时,需要注意几个基本规则。
1. 每个 SELECT 查询的列数必须相同
正确写法:
SELECT id, name FROM users UNION SELECT id, name FROM admins;
错误写法:
SELECT id, name FROM users UNION SELECT id FROM admins;
第一个查询返回两列,第二个查询只返回一列,列数不一致,MySQL 无法合并结果。
2. 对应列的数据类型应该兼容
例如:
SELECT id, name FROM users UNION SELECT id, title FROM articles;
这条 SQL 在语法上可能没有问题,因为两个查询都返回两列。
但是从业务含义上看,第二列一边是用户名 name,一边是文章标题 title,语义可能并不统一。
因此,在使用 UNION 时,不仅要保证列数一致,也要尽量保证对应列的数据含义一致。
3. 最终结果的列名取第一个 SELECT 的列名
例如:
SELECT id AS user_id, name AS user_name FROM users UNION SELECT id AS admin_id, name AS admin_name FROM admins;
最终结果中的列名是:
user_id | user_name
而不是:
admin_id | admin_name
也就是说,UNION 最终结果集的字段名由第一个 SELECT 决定。
五、UNION 中的 ORDER BY 和 LIMIT
如果想对合并后的最终结果排序,可以把 ORDER BY 写在最后。
例如:
SELECT id, name FROM users UNION ALL SELECT id, name FROM admins ORDER 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倒序排序。
六、UNION 的常见使用场景
假设有两张学生表:
students_2024 students_2025
现在想把两个年份的学生数据合并查询出来,可以这样写:
SELECT id, name, '2024' AS year FROM students_2024 UNION ALL SELECT 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
这种写法在分表查询、历史数据合并、报表统计中都很常见。
七、UNION 和 JOIN 的区别
很多人刚学 SQL 时,会把 UNION 和 JOIN 混淆。
它们的区别其实很简单。
UNION:上下合并结果
SELECT name FROM customers UNION SELECT name FROM suppliers;
可以理解为:
customers 查询结果
+
suppliers 查询结果
它是把多批结果合并成更多行。
JOIN:左右关联字段
SELECT orders.id, users.name FROM orders JOIN users ON orders.user_id = users.id;
可以理解为:
订单信息 + 用户信息
它是根据关联条件,把多张表的数据拼接到同一行中。
八、UNION 和 UNION ALL 如何选择?
一般可以按照下面的原则选择:
如果需要去重,使用:
UNION
如果不需要去重,使用:
UNION ALL
在实际项目中,UNION ALL 的使用频率通常更高,因为它不会进行去重处理,性能相对更好。
只有在确实需要去除重复数据时,才使用 UNION。
九、总结
本文主要介绍了 MySQL 中 UNION 的用法。
总结一下:
UNION用于合并多个SELECT查询结果;UNION默认会去除重复行;UNION ALL不会去重,性能通常更好;- 多个
SELECT的列数必须一致; - 对应列的数据类型最好保持兼容;
- 最终结果的列名由第一个
SELECT决定; ORDER BY写在最后时,是对整个合并结果排序;UNION是上下拼接,JOIN是左右关联。
一句话记忆:
UNION 合并结果并去重,UNION ALL 合并结果不去重;列数要一致,类型要兼容,字段名看第一个 SELECT。
到此这篇关于MySQL 中 UNION 的用法详解的文章就介绍到这了,更多相关MySQL UNION用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
