MySQL 合并查询结果:UNION 操作符
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观
在 MySQL 中,UNION
操作符用于合并两个或多个 SELECT
查询的结果,并将它们组合成一个结果集。UNION
可以帮助我们将多张表的结果汇总,并且自动去除重复行。
1. 基本语法
UNION
的基本语法如下:
SELECT 列1, 列2, ...
FROM 表1
[WHERE 条件]
UNION
SELECT 列1, 列2, ...
FROM 表2
[WHERE 条件];
- SELECT:用于定义查询语句,指定要查询的列和表。
- UNION:用于将多个查询的结果合并在一起。
- WHERE:可选项,可以对每个查询设置条件。
注意:每个
SELECT
查询的列数和数据类型必须一致,以便在结果中按列正确合并。
2. UNION 和 UNION ALL 的区别
- UNION:默认去除重复记录,只返回唯一结果集。
- UNION ALL:包含所有记录,包括重复数据,性能上比
UNION
更高,因为不需要去重操作。
例如:
SELECT name FROM t_employee
UNION
SELECT name FROM t_manager;
此语句会返回两个表中的所有唯一 name
,去除了重复值。
而如果使用 UNION ALL
:
SELECT name FROM t_employee
UNION ALL
SELECT name FROM t_manager;
此语句会返回所有 name
,包括重复项。
3. 使用 UNION
进行条件查询
假设有两张表, t_customer
客户表和 t_supplier
供应商表,其中都包含 name
和 city
列。我们希望获取位于 “上海” 的客户和供应商:
SELECT name, city FROM t_customer
WHERE city = '上海'
UNION
SELECT name, city FROM t_supplier
WHERE city = '上海';
此语句会返回在 t_customer
和 t_supplier
表中 city
为 “上海” 的所有唯一 name
和 city
。
4. ORDER BY
和 UNION
配合使用
可以对 UNION
合并后的结果集使用 ORDER BY
进行排序,但排序语句只能放在最后。例如:
SELECT name, city FROM t_customer
UNION
SELECT name, city FROM t_supplier
ORDER BY name;
此语句会合并两个表的数据并按 name
升序排列。
5. UNION
中的列类型要求
每个 SELECT
语句的列数量和数据类型必须相同,数据类型不一定完全匹配,但应兼容。例如:
SELECT name, phone FROM t_customer
UNION
SELECT supplier_name AS name, supplier_phone AS phone FROM t_supplier;
此处 name
和 phone
的列名和数据类型相同,因此可以进行 UNION
操作。
6. 实际应用场景
示例 1:从多个表获取不同数据源的记录
假设有两个表 t_employee
和 t_freelancer
,其中都包含 name
和 project_count
列。我们希望获取公司员工和自由职业者的项目数量总和:
SELECT name, project_count FROM t_employee
UNION
SELECT name, project_count FROM t_freelancer;
此语句会返回两个表中所有的人员及其项目数量(去重后的结果)。
示例 2:将相似结构的多个表合并
在一个多租户系统中,可能会将不同客户的数据放在不同表中。假设我们有两个客户表 t_clientA_order
和 t_clientB_order
,结构相同。要获取两个客户的所有订单,可以使用 UNION
:
SELECT order_id, product, amount FROM t_clientA_order
UNION ALL
SELECT order_id, product, amount FROM t_clientB_order;
此语句会返回 t_clientA_order
和 t_clientB_order
中的所有订单(包括重复项)。
7. 小结
UNION
是 MySQL 中的强大工具,可以将多个 SELECT
结果合并。UNION
默认去重,而 UNION ALL
包含所有结果,性能更高。合理使用 UNION
可以帮助我们在多表查询和数据整合时有效提升效率,同时简化 SQL 逻辑,适用于各种数据查询和合并的实际场景。