union union all intersect minus
时间: 2025-06-01 10:03:56 浏览: 25
### SQL 中 UNION、UNION ALL、INTERSECT 和 MINUS 的区别及用法
#### 1. UNION
`UNION` 操作符用于合并两个或多个 `SELECT` 语句的结果集。要求每个 `SELECT` 语句的列数必须相同,且对应列的数据类型也必须一致[^2]。此外,`UNION` 会自动去除重复的行。
**语法:**
```sql
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
```
**示例:**
```sql
SELECT empno, ename FROM emp WHERE deptno = 30
UNION
SELECT empno, ename FROM emp WHERE job = 'MANAGER';
```
#### 2. UNION ALL
`UNION ALL` 与 `UNION` 类似,但不会去除重复的行,因此性能通常优于 `UNION`[^5]。它将所有结果集中的数据全部显示出来,包括重复项。
**语法:**
```sql
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
```
**示例:**
```sql
SELECT empno, ename FROM emp WHERE deptno = 30
UNION ALL
SELECT empno, ename FROM emp WHERE job = 'MANAGER';
```
#### 3. INTERSECT
`INTERSECT` 操作符返回两个查询结果集的交集,即同时存在于两个结果集中的记录。需要注意的是,`INTERSECT` 在某些数据库中不被支持(如 MySQL 和 PostgreSQL),但在 Oracle 和 SQL Server 中可用[^1]。
**语法:**
```sql
SELECT column_name(s) FROM table1
INTERSECT
SELECT column_name(s) FROM table2;
```
**示例:**
```sql
SELECT empno FROM emp WHERE deptno = 30
INTERSECT
SELECT empno FROM emp WHERE job = 'MANAGER';
```
#### 4. MINUS
`MINUS` 操作符返回第一个查询结果集中有但第二个查询结果集中没有的记录。与 `INTERSECT` 类似,`MINUS` 在某些数据库中也不被支持(如 MySQL 和 PostgreSQL),但在 Oracle 和 DB2 中可用。
**语法:**
```sql
SELECT column_name(s) FROM table1
MINUS
SELECT column_name(s) FROM table2;
```
**示例:**
```sql
SELECT empno FROM emp WHERE deptno = 30
MINUS
SELECT empno FROM emp WHERE job = 'MANAGER';
```
#### 数据库兼容性总结
- `UNION` 和 `UNION ALL`:在大多数现代关系型数据库管理系统中通用,包括 Oracle、MySQL、SQL Server、PostgreSQL 和 DB2 等。
- `INTERSECT`:在 Oracle、SQL Server 和 DB2 中可用,但在 MySQL 和 PostgreSQL 中不直接支持。
- `MINUS`:在 Oracle 和 DB2 中可用,但在 MySQL 和 PostgreSQL 中不直接支持。对于不支持的数据库,可以通过其他方法(如 `LEFT JOIN` 和 `WHERE` 子句)实现类似效果[^1]。
#### 使用场景
- **UNION**:当需要合并两个结果集并去重时使用。
- **UNION ALL**:当需要快速合并两个结果集且不需要去重时使用。
- **INTERSECT**:当需要获取两个结果集的交集时使用。
- **MINUS**:当需要获取第一个结果集中有但第二个结果集中没有的记录时使用。
### 示例代码对比
以下为一个完整的示例,展示四种操作的区别:
```sql
-- 表 A
CREATE TABLE A (id INT);
INSERT INTO A VALUES (1), (2), (3);
-- 表 B
CREATE TABLE B (id INT);
INSERT INTO B VALUES (2), (3), (4);
-- UNION
SELECT id FROM A
UNION
SELECT id FROM B;
-- UNION ALL
SELECT id FROM A
UNION ALL
SELECT id FROM B;
-- INTERSECT
SELECT id FROM A
INTERSECT
SELECT id FROM B;
-- MINUS
SELECT id FROM A
MINUS
SELECT id FROM B;
```
#### 结果分析
- **UNION**:返回 `[1, 2, 3, 4]`。
- **UNION ALL**:返回 `[1, 2, 3, 2, 3, 4]`。
- **INTERSECT**:返回 `[2, 3]`。
- **MINUS**:返回 `[1]`。
阅读全文
相关推荐




















