【union all的用法】在SQL查询中,`UNION ALL` 是一个非常实用的语法,用于合并两个或多个 `SELECT` 语句的结果集。与 `UNION` 不同,`UNION ALL` 不会自动去重,而是将所有结果合并在一起,包括重复的数据。以下是对 `UNION ALL` 的详细总结。
一、基本概念
| 术语 | 含义 |
| `UNION ALL` | 用于合并多个 `SELECT` 查询结果,保留所有行(包括重复数据) |
| `UNION` | 合并多个 `SELECT` 查询结果,但会自动去除重复行 |
| 结果集 | 每个 `SELECT` 语句返回的数据集合 |
二、使用场景
| 场景 | 描述 |
| 数据汇总 | 将不同表或不同数据库中的数据合并展示 |
| 多源数据整合 | 从多个数据源获取信息并统一输出 |
| 快速生成报表 | 合并多个查询结果,提高查询效率 |
| 保留重复记录 | 在需要保留重复数据时使用 `UNION ALL` 而非 `UNION` |
三、语法结构
```sql
SELECT column1, column2, ...
FROM table1
UNION ALL
SELECT column1, column2, ...
FROM table2;
```
> 注意:每个 `SELECT` 语句的列数和数据类型必须一致。
四、示例说明
假设我们有两个表:`employees` 和 `contractors`,它们的结构如下:
employees 表:
| id | name | salary |
| 1 | 张三 | 5000 |
| 2 | 李四 | 6000 |
contractors 表:
| id | name | rate |
| 3 | 王五 | 80 |
| 4 | 赵六 | 90 |
如果我们想将这两个表的信息合并成一个结果集,可以使用 `UNION ALL`:
```sql
SELECT id, name, 'employee' AS type FROM employees
UNION ALL
SELECT id, name, 'contractor' AS type FROM contractors;
```
输出结果:
| id | name | type |
| 1 | 张三 | employee |
| 2 | 李四 | employee |
| 3 | 王五 | contractor |
| 4 | 赵六 | contractor |
五、注意事项
| 事项 | 说明 |
| 列匹配 | 所有 `SELECT` 语句的列数和数据类型必须相同 |
| 性能影响 | 使用 `UNION ALL` 会比 `UNION` 更快,因为不需要去重 |
| 重复数据 | 如果需要去重,应使用 `UNION` 而不是 `UNION ALL` |
| 可读性 | 建议对每个 `SELECT` 添加注释,提高可读性 |
六、总结
`UNION ALL` 是一种高效的 SQL 工具,适用于需要合并多个查询结果且保留所有记录的场景。它比 `UNION` 更加灵活,但需要注意列的匹配和性能问题。合理使用 `UNION ALL` 能显著提升数据处理的效率和灵活性。


