在SQL数据库操作中,当需要从多个表中获取结构相似的数据,或者将同一个表的不同筛选条件的结果整合为一个结果集时,UNION操作符是最常用的解决方案。它可以将多个SELECT语句的查询结果合并成一个结果集返回,不需要用户手动处理多份数据再做拼接。

UNION基础语法结构
UNION的基本使用格式非常固定,核心是将多个SELECT语句用UNION关键字连接,每个SELECT语句的查询结果会按顺序合并到最终的结果集中。基础语法如下:
-- 合并两个查询结果的UNION基础语法 SELECT 列1, 列2, 列3 FROM 表1 WHERE 筛选条件1 UNION SELECT 列1, 列2, 列3 FROM 表2 WHERE 筛选条件2;
需要注意的是,每个参与合并的SELECT语句返回的列数必须完全一致,对应位置的列的数据类型也需要兼容,否则数据库会直接返回语法错误。
UNION使用核心注意事项
使用UNION合并查询结果时,有几个必须遵守的规则,否则会出现执行失败或者结果异常的情况:
- 每个SELECT语句返回的列数量必须相同,不能一个返回2列,另一个返回3列
- 对应列的排序位置要一致,数据类型需要兼容,比如第一个查询的第一列是INT类型,第二个查询的第一列也应该是数值类型
- UNION默认会对合并后的结果集进行去重,只保留不重复的记录
- 最终结果的列名默认取第一个SELECT语句的列名,后续SELECT的列名不会生效
- 如果要给最终结果排序,需要在最后一个SELECT语句之后添加ORDER BY子句,不能在每个SELECT后面单独加
UNION和UNION ALL的区别
很多用户会混淆UNION和UNION ALL的用法,两者的核心差异在于是否去重:
| 对比项 | UNION | UNION ALL |
|---|---|---|
| 去重逻辑 | 合并后会自动去除重复的记录 | 直接合并所有结果,保留重复记录 |
| 执行效率 | 需要额外做去重运算,效率更低 | 不需要去重,执行速度更快 |
| 适用场景 | 需要最终结果无重复时使用 | 确认结果无重复,或者需要保留重复记录时使用 |
实际使用示例
假设我们有两个学生成绩表,分别是class_1_score和class_2_score,两个表的结构都是student_id(学生ID)、student_name(学生姓名)、score(成绩),现在需要合并两个班的所有学生成绩,同时去除重复的记录,可以使用以下语句:
-- 合并两个班级的成绩,去重重复记录 SELECT student_id, student_name, score FROM class_1_score UNION SELECT student_id, student_name, score FROM class_2_score ORDER BY score DESC;
如果确认两个班没有重复的学生记录,想要提升查询效率,只需要把UNION换成UNION ALL即可:
-- 合并两个班级的成绩,保留所有记录 SELECT student_id, student_name, score FROM class_1_score UNION ALL SELECT student_id, student_name, score FROM class_2_score ORDER BY score DESC;
常见错误示例
以下是新手经常出现的错误写法,需要注意避免:
-- 错误示例1:两个查询列数不一致 SELECT student_id, student_name FROM class_1_score UNION SELECT student_id, student_name, score FROM class_2_score; -- 错误示例2:在每个SELECT后单独加排序 SELECT student_id, student_name, score FROM class_1_score ORDER BY score UNION SELECT student_id, student_name, score FROM class_2_score ORDER BY score;
第一个错误是因为两个SELECT返回的列数不同,数据库会提示列数不匹配的错误;第二个错误是因为UNION合并时,排序只能放在最后一个SELECT之后,单独给每个SELECT加排序会导致语法错误。