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 供应商表,其中都包含 namecity 列。我们希望获取位于 “上海” 的客户和供应商:

SELECT name, city FROM t_customer
WHERE city = '上海'
UNION
SELECT name, city FROM t_supplier
WHERE city = '上海';

此语句会返回在 t_customert_supplier 表中 city 为 “上海” 的所有唯一 namecity

4. ORDER BYUNION 配合使用

可以对 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;

此处 namephone 的列名和数据类型相同,因此可以进行 UNION 操作。

6. 实际应用场景

示例 1:从多个表获取不同数据源的记录

假设有两个表 t_employeet_freelancer,其中都包含 nameproject_count 列。我们希望获取公司员工和自由职业者的项目数量总和:

SELECT name, project_count FROM t_employee
UNION
SELECT name, project_count FROM t_freelancer;

此语句会返回两个表中所有的人员及其项目数量(去重后的结果)。

示例 2:将相似结构的多个表合并

在一个多租户系统中,可能会将不同客户的数据放在不同表中。假设我们有两个客户表 t_clientA_ordert_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_ordert_clientB_order 中的所有订单(包括重复项)。

7. 小结

UNION 是 MySQL 中的强大工具,可以将多个 SELECT 结果合并。UNION 默认去重,而 UNION ALL 包含所有结果,性能更高。合理使用 UNION 可以帮助我们在多表查询和数据整合时有效提升效率,同时简化 SQL 逻辑,适用于各种数据查询和合并的实际场景。