楼主: liyonglin2007
217 0

[教育经济学基本知识] MySQL UNION 操作符:结果集合并的艺术 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

小学生

14%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
40 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2018-3-5
最后登录
2018-3-5

楼主
liyonglin2007 发表于 2025-11-12 19:11:27 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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????点点关注,收藏不迷路????

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:MySQL Union sql NIO 操作符

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2026-1-5 14:14