> 技术文档 > SQL:合并查询(UNION)_sql union

SQL:合并查询(UNION)_sql union

目录

🧩 什么是 UNION?

UNION vs UNION ALL

✅ 简单例子

UNION 的常见应用场景

与其他子句联合使用

🚧 UNION注意事项

性能优化建议


🧩 什么是 UNION

UNION 是 SQL 中的一个关键字,用于 合并多个 SELECT 查询结果,并去除重复的记录,形成一个新的结果表。

基本语法:

SELECT 列1, 列2, ...FROM 表1UNIONSELECT 列1, 列2, ...FROM 表2;

重点规则:

  1. 每个 SELECT 查询的列数量必须一致。

  2. 每个对应列的数据类型要兼容(如都是字符串、都是数字)。

  3. UNION 会自动去除重复行,如果你想保留重复,可以使用 UNION ALL

UNION vs UNION ALL

操作符 是否去重 性能 用途 UNION 是 较慢(多了去重操作) 多来源整合数据,避免重复记录 UNION ALL 否 更快 统计所有记录(包括重复项)
-- 去除重复SELECT name FROM employeesUNIONSELECT name FROM managers;-- 保留重复SELECT name FROM employeesUNION ALLSELECT name FROM managers;

✅ 简单例子

假设我们有两个表:

表:students_2023+----+--------+| id | name |+----+--------+| 1 | Alice || 2 | Bob |+----+--------+表:students_2024+----+--------+| id | name |+----+--------+| 3 | Carol || 4 | Bob |+----+--------+

 用 UNION 合并名字:

SELECT name FROM students_2023UNIONSELECT name FROM students_2024;

 结果:

+--------+| name |+--------+| Alice || Bob || Carol |+--------+

Bob 出现了两次,但只保留了一个。

用 UNION ALL 不去重: 

SELECT name FROM students_2023UNION ALLSELECT name FROM students_2024;

结果: 

+--------+| name |+--------+| Alice || Bob || Carol || Bob |+--------+

 

UNION 的常见应用场景

1. 多张表中合并数据

合并来自不同年度的学生名单:

SELECT id, name FROM students_2023UNIONSELECT id, name FROM students_2024;

 2. 合并来自不同来源的相似数据

SELECT email FROM customersUNIONSELECT email FROM suppliers;

3. 加标签显示不同来源 (分类展示)

SELECT name, \'2023\' AS 来源 FROM students_2023UNIONSELECT name, \'2024\' FROM students_2024;

 

与其他子句联合使用

1. UNIONORDER BY

如上所示,ORDER BY 必须在最后一个 SELECT 的末尾出现。

2. UNIONLIMIT

你可以限制最终结果的行数:

SELECT name FROM customersUNIONSELECT name FROM employeesLIMIT 10;

3. UNIONWHERE

每个 SELECT 可以有自己的条件:

SELECT id, name FROM orders WHERE status = \'shipped\'UNIONSELECT id, name FROM orders_archive WHERE status = \'shipped\';

🚧 UNION注意事项

错误信息 原因 解决方法 列数不一致 两个 SELECT 的列数不同 确保 SELECT 的列数相同 类型不一致 比如一个是数字,一个是字符串 用 CAST()CONVERT() 转换类型 排序无效 ORDER BY 写错位置 必须写在最后的 SELECT 之后

正确排序方式:

SELECT name FROM students_2023UNIONSELECT name FROM students_2024ORDER BY name;

性能优化建议

  • 如果你不需要去重,尽量用 UNION ALL,性能会提升。

  • 各子句中尽可能使用索引字段进行过滤。

  • 对于大型数据源,先进行聚合再合并结果(如 GROUP BY + UNION)。