MySQL UNION 操作符:结果集合并的艺术
前言
在数据库查询中,经常需要将多个查询结果整合为一个结果集。MySQL 的 UNION 操作符提供了强大的结果集整合能力,本文将全面解析 UNION 和 UNION ALL 的用法、区别以及性能优化策略,帮助开发者掌握多结果集整合的技术。
一、UNION 操作符基础
1.1 基本语法结构
SELECT column1, column2, ...
FROM table1
[WHERE conditions]
UNION [ALL]
SELECT column1, column2, ...
FROM table2
[WHERE conditions]
[ORDER BY clause]
[LIMIT clause];
1.2 核心组件解析
...
二、UNION vs UNION ALL
2.1 主要区别对比
| 特性 | UNION | UNION ALL |
|---|---|---|
| 重复处理 | 去除重复行 | 保留所有行 |
| 性能 | 较慢(需排序去重) | 较快 |
| 结果排序 | 自动排序 | 保留原始顺序 |
| 适用场景 | 需要唯一结果 | 需要全部结果 |
2.2 可视化区别

三、基础使用示例
3.1 简单合并查询
-- 合并客户和供应商所在城市(去重)
SELECT city FROM customers
UNION
SELECT city FROM suppliers
ORDER BY city;
3.2 保留所有记录的合并
-- 合并两个部门的员工列表(不去重)
SELECT employee_id, name FROM hr_employees
UNION ALL
SELECT employee_id, name FROM it_employees
ORDER BY name;
3.3 带条件的合并查询
-- 合并不同条件的商品
SELECT product_id, name FROM products
WHERE category = 'Electronics' AND price > 1000
UNION
SELECT product_id, name FROM products
WHERE category = 'Furniture' AND weight > 50
ORDER BY name;
四、高级应用技巧
4.1 不同表但结构相同的合并
classDiagram
class 表1 {
+id INT
+name VARCHAR
}
class 表2 {
+id INT
+title VARCHAR
}
note for 表1 "UNION时name和title需类型兼容"
-- 合并文章和产品名称
SELECT id, title AS name FROM articles
UNION
SELECT id, name FROM products
ORDER BY name;
4.2 使用NULL填充缺失列
-- 合并员工和部门数据(部门无first_name)
SELECT first_name, last_name, 'Employee' AS type FROM employees
UNION
SELECT NULL, department_name, 'Department' FROM departments
ORDER BY last_name;
4.3 多UNION组合使用
-- 合并三张日志表
SELECT log_date, message FROM system_logs
UNION ALL
SELECT log_date, content FROM application_logs
UNION ALL
SELECT error_time, error_msg FROM error_logs
ORDER BY log_date DESC
LIMIT 1000;
五、性能优化策略
5.1 UNION执行流程
...
5.2 优化建议
- 优先使用UNION ALL:确认不需要去重时
- 限制结果集大小:添加WHERE条件和LIMIT
- 保持列一致性:避免类型转换
- 索引优化:确保各SELECT高效执行
- 分批处理:大结果集使用分页
5.3 优化示例
-- 优化前(低效)
SELECT * FROM large_table1
UNION
SELECT * FROM large_table2;
????The Begin????点点关注,收藏不迷路????
-- 优化后(高效)
SELECT id, name FROM large_table1 WHERE created_at > '2023-01-01'
UNION ALL
SELECT id, name FROM large_table2 WHERE status = 'active'
LIMIT 1000;
六、实际应用场景
6.1 电商平台数据合并
-- 合并商品和服务的搜索建议
SELECT 'product' AS type, product_name AS name FROM products
WHERE product_name LIKE '%手机%'
UNION
SELECT 'service' AS type, service_name FROM services
WHERE service_name LIKE '%维修%'
ORDER BY name
LIMIT 10;
6.2 多系统数据整合
-- 合并三个系统的用户信息
SELECT user_id, username, email FROM system_a_users
WHERE status = 'active'
UNION ALL
SELECT user_id, login_name, contact_email FROM system_b_users
WHERE is_valid = 1
UNION ALL
SELECT id, user_name, user_email FROM system_c_accounts
WHERE deleted = 0
ORDER BY username;
6.3 报表数据汇总
-- 合并季度销售记录
SELECT 'Q1' AS quarter, product_id, SUM(amount) AS total
FROM sales_q1
GROUP BY product_id
UNION ALL
SELECT 'Q2', product_id, SUM(amount) FROM sales_q2 GROUP BY product_id
UNION ALL
SELECT 'Q3', product_id, SUM(amount) FROM sales_q3 GROUP BY product_id
ORDER BY quarter, total DESC;
七、常见问题解答
Q1: UNION 和 JOIN 有什么区别?
A:
JOIN 是横向合并(列合并),基于关联条件
UNION 是纵向合并(行合并),要求列结构一致
Q2: UNION 操作对列名如何处理?
A:
结果集使用首个 SELECT 的列名,后续 SELECT 的列名被忽略
Q3: 如何对UNION结果进行分页?
(SELECT id, name FROM table1 ORDER BY id LIMIT 10)
UNION ALL
(SELECT id, name FROM table2 ORDER BY id LIMIT 10)
ORDER BY id
LIMIT 10 OFFSET 20;
八、最佳实践总结
明确需求
:是否需要去重选择UNION/UNION ALL
结构一致
:确保各SELECT列数和类型兼容
性能优先
:尽量使用UNION ALL并优化各SELECT
适当排序
:在最终结果上排序而非单个SELECT
添加标识
:使用常量列区分数据来源
九、总结
本文全面介绍了MySQL UNION操作符的各个方面:
基础语法和核心概念
UNION与UNION ALL的区别
高级应用技巧和实际案例
性能优化策略和最佳实践
常见问题解决方案
通过掌握这些知识,您可以:
高效合并多个查询结果
根据需求选择合适合并方式
优化UNION查询性能
处理复杂的数据合并场景
建议在实际开发中,对大数据集的UNION操作进行性能测试,并考虑使用临时表等替代方案处理特别复杂的合并需求。

????The End????点点关注,收藏不迷路????


雷达卡


京公网安备 11010802022788号







