SQL:合并查询(UNION)

发布于:2025-05-27 ⋅ 阅读:(38) ⋅ 点赞:(0)

目录

🧩 什么是 UNION?

UNION vs UNION ALL

✅ 简单例子

UNION 的常见应用场景

与其他子句联合使用

🚧 UNION注意事项

性能优化建议


🧩 什么是 UNION

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

基本语法:

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

重点规则:

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

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

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

UNION vs UNION ALL

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

-- 保留重复
SELECT name FROM employees
UNION ALL
SELECT name FROM managers;

✅ 简单例子

假设我们有两个表:

表:students_2023
+----+--------+
| id | name   |
+----+--------+
| 1  | Alice  |
| 2  | Bob    |
+----+--------+

表:students_2024
+----+--------+
| id | name   |
+----+--------+
| 3  | Carol  |
| 4  | Bob    |
+----+--------+

 用 UNION 合并名字:

SELECT name FROM students_2023
UNION
SELECT name FROM students_2024;

 结果:

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

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

用 UNION ALL 不去重: 

SELECT name FROM students_2023
UNION ALL
SELECT name FROM students_2024;

结果: 

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

 

UNION 的常见应用场景

1. 多张表中合并数据

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

SELECT id, name FROM students_2023
UNION
SELECT id, name FROM students_2024;

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

SELECT email FROM customers
UNION
SELECT email FROM suppliers;

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

SELECT name, '2023' AS 来源 FROM students_2023
UNION
SELECT name, '2024' FROM students_2024;

 

与其他子句联合使用

1. UNIONORDER BY

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

2. UNIONLIMIT

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

SELECT name FROM customers
UNION
SELECT name FROM employees
LIMIT 10;

3. UNIONWHERE

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

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

🚧 UNION注意事项

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

正确排序方式:

SELECT name FROM students_2023
UNION
SELECT name FROM students_2024
ORDER BY name;

性能优化建议

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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到