MySQL联合查询UNION与UNION ALL的区别及实战用法

陈默
陈默
发布时间:2026-10-14| 7人浏览过
原创

在MySQL开发中,联合查询常用于合并多个SELECT语句的结果。UNION会自动去除重复行,确保结果唯一;而UNION ALL则保留所有记录,包含重复值。理解两者的区别有助于在数据整合时平衡数据的准确性与查询性能。

UNION与UNION ALL的核心差异

UNION操作用于将两个或多个SELECT语句的结果集合并为一个。其关键特性在于它会默认消除结果集中的重复行。这意味着,如果不同子查询中存在完全相同的记录,最终输出中只会出现一次。相比之下,UNION ALL不进行去重处理,直接将所有子查询的结果纵向拼接,无论是否有重复数据。这种差异直接影响查询性能:由于UNION需要额外的排序和去重步骤,其执行时间通常长于UNION ALL。

第1步:掌握基础语法规范

在使用联合查询时,必须遵守严格的列匹配规则。

  • 列数一致:参与联合的每个SELECT语句必须拥有相同数量的列。
  • 类型兼容:对应位置的列应具有相似的数据类型(例如数字对数字,字符串对字符串)。
  • 顺序相同:各语句中列的排列顺序必须保持一致。

UNION 基本语法:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

UNION ALL 基本语法:

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

注意:合并结果集的列名始终采用第一个SELECT语句中的列名。

第2步:直观对比运行结果

为了清晰展示两者的效果,假设存在两张员工表:Employees_China(中国员工)和Employees_USA(美国员工),其中“Carter, Thomas”在两表中均存在。

测试表数据:

Employees_China: 01 Zhang, Hua | 02 Wang, Wei | 03 Carter, Thomas | 04 Yang, Ming

Employees_USA: 01 Adams, John | 02 Bush, George | 03 Carter, Thomas | 04 Gates, Bill

使用 UNION 查询:

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA;

结果分析:输出列表中,“Carter, Thomas”仅出现一次。因为UNIGN过滤了重复项。

使用 UNION ALL 查询:

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA;

结果分析:输出列表中,“Carter, Thomas”出现两次。因为UNION ALL保留了来自两边表的所有原始记录。

第3步:处理复杂场景的注意事项

在实际项目中,联合查询往往涉及更复杂的逻辑,需注意以下几点:

  1. 子句排序限制:若需要对子查询进行排序或限制行数(如ORDER BY, LIMIT),必须将该子查询用括号()包裹。例如:(SELECT * FROM t ORDER BY id) UNION (SELECT * FROM t2 ORDER BY id)。若未加括号,ORDER BY可能会被视为针对最终合并结果,导致语法错误或非预期行为。
  2. 列名对齐技巧:当不同表中的字段名不一致但含义相同时,需在SELECT中使用AS别名进行转换,以确保两部分的列结构匹配。例如:`SELECT id, name AS subject FROM table_a` 联合 `SELECT id, category AS subject FROM table_b`。
  3. 性能考量:如果明确知道合并的两部分数据来源互斥(如不同地区的独立数据表),或者不需要去重校验,优先使用UNION ALL以获得更快的响应速度。

第4步:整站搜索实战应用

一个典型的应用场景是网站全局搜索。当用户输入关键词时,系统需在文章表(article)、分类表(web_class)等多个表中查找包含该词的内容,并按一定优先级返回结果。

以下示例展示了如何结合精确匹配和模糊分词,利用联合查询构建搜索结果:

select * from 
(SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND `subject` LIKE '%调整图片%' ORDER BY `add_time` DESC) as t1
union all
select * from 
(SELECT `id`,`class_name` AS `subject` FROM `web_class` WHERE `active`='1' AND `class_name` LIKE '%调整图片%' ORDER BY `class_id` DESC) as t2
union
select * from 
(SELECT `id`,`subject` FROM `article` WHERE `active`='1' AND (`subject` LIKE '%调整%' OR `subject` LIKE '%图片%') ORDER BY `add_time` DESC) as t3;

逻辑解析:

  • t1分支(UNION ALL前段):精确查找标题为“调整图片”的文章。
  • t2分支:查找标题为“调整图片”的分类。此处用 UNION ALL,因为文章表和分类表没有重叠的主键ID概念,无需去重。
  • t3分支(UNION后段):查找标题含“调整”或“图片”的相关文章。这里使用 UNION(非ALL),是因为t3的结果集合天然包含了t1的结果(即含“调整图片”必含“调整”或“图片”)。使用UNION可以剔除t3中与t1重复的记录,避免搜索结果中同一篇文章因匹配度算法不同而显示两次。

通过以上组合,可以实现高优先级精确命中在前、低优先级相关补位在后的排序逻辑(需配合外层排序进一步优化)。

总结

MySQL的联合查询功能强大,合理选择UNION和UNION ALL是提升数据整合效率的关键。简单来说:追求结果纯净且不在意轻微性能损耗时用UNION;追求极致查询速度且明确无重复数据隐患时用UNION ALL。在实际编码中,务必注意列结构的对齐和子查询语法的规范性。

以上就是MySQL联合查询UNION和UNION ALL的使用介绍,更多关于数据库SQL优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。