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语句必须满足以下条件:

  1. 列的数量相同:例如,第一个查询返回3列,第二个查询也必须返回3列。
  2. 列的数据类型兼容:例如,第一列若为INT类型,则第二个查询的对应列也应为数值类型(如FLOATDECIMAL)。若类型不匹配,需通过CASTCONVERT显式转换。

示例代码

-- 正确示例:列数量与类型匹配  
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_usersguest_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实战能力。

在实际应用中,建议根据具体需求选择UNIONUNION ALL,并注意数据类型匹配与性能优化。通过不断练习和案例分析,你将能更加灵活地运用这一操作符,解决各类数据整合与分析问题。


(全文约1600字)

最新发布