SQL UNION 操作符(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在数据管理与分析领域,SQL UNION操作符是一个强大且实用的工具,它允许开发者将多个查询的结果合并为一个单一的结果集。无论是整合不同表的数据、简化复杂查询逻辑,还是处理跨表的统计需求,UNION操作符都能提供简洁高效的解决方案。对于编程初学者和中级开发者而言,掌握这一操作符不仅能提升SQL编程能力,还能为解决实际业务问题提供新的思路。本文将通过循序渐进的方式,结合案例与代码示例,深入解析SQL UNION操作符的核心原理、使用技巧及常见误区。
一、SQL UNION操作符的基本语法与核心功能
1.1 基础语法结构
SQL UNION操作符的语法格式如下:
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
上述语句将两个SELECT
查询的结果合并,最终输出一个去重后的结果集。其核心功能可以概括为以下两点:
- 合并结果集:将多个查询的结果按行拼接为一个整体。
- 自动去重:默认会自动去除重复的行(若需保留重复行,需使用
UNION ALL
)。
1.2 形象比喻:如同整理两个文件夹
假设你有两个文件夹,分别存放着不同类别的文件(如“工作文档”和“学习资料”),但你希望将它们合并到一个文件夹中,并自动删除重复的文件。此时,UNION操作符就类似于这个“智能合并工具”——它不仅将两个文件夹的内容合并,还会自动识别并剔除重复项,最终生成一个整洁有序的结果集。
二、UNION操作符的三大关键特性
2.1 列的数量与类型必须严格匹配
UNION操作符要求参与合并的两个SELECT
语句必须满足以下条件:
- 列的数量相同:例如,第一个查询返回3列,第二个查询也必须返回3列。
- 列的数据类型兼容:例如,第一列若为
INT
类型,则第二个查询的对应列也应为数值类型(如FLOAT
或DECIMAL
)。若类型不匹配,需通过CAST
或CONVERT
显式转换。
示例代码:
-- 正确示例:列数量与类型匹配
SELECT id, name, age FROM employees;
UNION
SELECT staff_id, full_name, years_old FROM contractors;
-- 错误示例:列数量不一致
SELECT id, name FROM users;
UNION
SELECT user_id, first_name, last_name FROM customers;
2.2 自动去重机制
默认情况下,UNION
会自动去除结果集中重复的行。若希望保留所有行(包括重复项),需使用UNION ALL
替代。
对比表格:
| 特性 | UNION
| UNION ALL
|
|---------------|------------------|-------------------|
| 是否去重 | 是 | 否 |
| 性能 | 较低(需去重) | 较高(直接拼接) |
| 使用场景 | 需要唯一结果集 | 保留所有原始数据 |
2.3 列名以第一个SELECT为准
合并后的结果集的列名将采用第一个SELECT
语句中的列名。若需自定义列名,可在第一个查询中使用AS
关键字。
示例代码:
SELECT id AS employee_id, name, salary * 12 AS annual_salary
FROM employees
UNION
SELECT staff_id, full_name, yearly_salary
FROM contractors;
-- 最终结果列名将为:employee_id | name | annual_salary
三、UNION操作符的典型应用场景
3.1 场景一:合并不同表的同类数据
假设有一个电商平台,用户信息分散在两个表中(如registered_users
和guest_users
)。若需统计所有用户的购买记录,可通过UNION将两表数据合并:
示例代码:
SELECT user_id, order_date, total_price
FROM registered_users_orders
UNION
SELECT guest_id AS user_id, order_date, total_price
FROM guest_orders;
3.2 场景二:整合跨部门的统计信息
例如,公司有两个部门(销售部和市场部),各自的业绩数据存储在不同表中。通过UNION可生成统一的业绩报告:
示例代码:
SELECT 'Sales' AS department, employee_id, total_sales
FROM sales_performance
UNION
SELECT 'Marketing', team_id, campaign_budget
FROM marketing_budgets;
3.3 场景三:动态查询条件合并
在构建复杂查询时,UNION可简化条件分支的合并。例如,统计某商品的销售来源:
-- 来自线上渠道的销售
SELECT 'Online' AS source, SUM(quantity) AS total_units
FROM online_sales
WHERE product_id = 101
UNION
-- 来自线下渠道的销售
SELECT 'Offline', SUM(quantity)
FROM physical_stores_sales
WHERE product_id = 101;
四、注意事项与常见问题
4.1 数据类型不匹配的处理
若参与UNION的列类型不兼容,需显式转换。例如,将VARCHAR
转换为INT
:
SELECT CAST(employee_id AS INT), name
FROM employees
UNION
SELECT staff_code, full_name
FROM contractors; -- 假设staff_code存储为字符串格式
4.2 性能优化建议
- 优先使用UNION ALL:若无需去重,
UNION ALL
的执行速度更快。 - 减少列的数量:仅选择必要的列,避免全表扫描。
- 利用索引:对参与查询的列建立索引,提升合并效率。
4.3 排序与分组的限制
UNION
的结果集仅能通过一个ORDER BY
子句排序,且该子句需放在最后一个SELECT
的末尾。例如:
SELECT name, score FROM exams
UNION
SELECT student_name, final_score FROM results
ORDER BY score DESC;
五、高级技巧与扩展应用
5.1 结合子查询与聚合函数
UNION可与子查询、聚合函数结合,实现复杂的数据分析。例如,统计各部门的平均薪资并合并:
SELECT 'Sales' AS department, AVG(salary) AS avg_salary
FROM employees
WHERE department = 'Sales'
UNION
SELECT 'Engineering', AVG(salary)
FROM employees
WHERE department = 'Engineering';
5.2 处理NULL值
UNION在比较行时,NULL
被视为相等。因此,若两行中仅某列值为NULL
,则会被视为重复项:
SELECT 1, NULL UNION SELECT 1, NULL; -- 仅返回一行
5.3 与JOIN操作符的对比
虽然UNION用于合并行,但JOIN
用于关联表的列。例如,获取员工及其部门信息需用JOIN
,而合并两个部门的员工列表则用UNION
:
-- 使用JOIN关联表
SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;
-- 使用UNION合并两个部门的员工
SELECT name FROM sales_employees
UNION
SELECT name FROM marketing_employees;
六、结论
通过本文的讲解,我们全面了解了SQL UNION操作符的核心功能、使用场景及注意事项。它不仅是简化复杂查询的强大工具,更是整合分散数据、提升开发效率的关键技术。无论是初学者还是中级开发者,掌握这一操作符都能显著增强SQL实战能力。
在实际应用中,建议根据具体需求选择UNION
或UNION ALL
,并注意数据类型匹配与性能优化。通过不断练习和案例分析,你将能更加灵活地运用这一操作符,解决各类数据整合与分析问题。
(全文约1600字)