联合查询
联合查询(UNION / UNION ALL) 用于将多个查询结果纵向合并成一个结果集。
不同于 JOIN(横向拼接字段),UNION 是纵向拼接行,常用于查询结构相同但数据来源不同的表。
1. 基本语法
Section titled “1. 基本语法”SELECT 字段列表 FROM 表AUNION [ALL]SELECT 字段列表 FROM 表B;两个查询的字段数、字段类型、顺序必须一致。
2. UNION 与 UNION ALL 的区别
Section titled “2. UNION 与 UNION ALL 的区别”| 关键字 | 功能 | 是否去重 | 性能 |
|---|---|---|---|
UNION | 合并结果集 | ✅ 去重 | 较慢 |
UNION ALL | 合并结果集 | ❌ 不去重 | 较快 |
示例:
SELECT name, city FROM user_aUNIONSELECT name, city FROM user_b;
UNION会自动去掉重复行。
SELECT name, city FROM user_aUNION ALLSELECT name, city FROM user_b;
UNION ALL会保留重复行,更适合大数据量。
假设公司有两张员工表(来自不同系统):
| 表名 | 字段 | 说明 |
|---|---|---|
| emp_2023 | name, dept | 旧系统 |
| emp_2024 | name, dept | 新系统 |
我们希望合并所有员工数据:
SELECT name, dept FROM emp_2023UNION ALLSELECT name, dept FROM emp_2024;结果:
| name | dept |
|---|---|
| 张三 | 技术部 |
| 李四 | 行政部 |
| 王五 | 技术部 |
| 张三 | 技术部 |
若希望去重,可改为
UNION。
4. UNION 的典型用途
Section titled “4. UNION 的典型用途”- 多表结构一致时的数据整合;
- 多分区或多时间段表的合并(如
log_2024_01,log_2024_02); - 数据迁移或备份前的合并统计;
- 模拟
FULL OUTER JOIN(MySQL 无原生支持):
SELECT * FROM 表1LEFT JOIN 表2 ON 表1.id = 表2.idUNIONSELECT * FROM 表1RIGHT JOIN 表2 ON 表1.id = 表2.id;5. 注意事项
Section titled “5. 注意事项”- 各子查询的列名、类型、数量必须一致;
ORDER BY只能出现在最后一个查询之后;- 若需为列起别名,应放在第一个查询中;
UNION默认去重,性能略低,可根据需求使用UNION ALL。