intersect, minus(转)

本文介绍SQL中的两种集合操作:intersect和minus。intersect用于找出两个或多个查询结果中的公共部分,例如找出不同部门间共有的职位。而minus则用于找出第一个查询结果中有但第二个查询结果中没有的数据,如特定部门独有的职位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

intersect, minus

intersect运算:返回查询结果中相同的部分
exp:各个部门中有哪些相同的工种
select job from 部门1
intersect
select job from 部门2
intersect
select job from 部门3;

minus运算: 返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。
在部门1中有,而在部门2中没有的工种
exp:select job from 部门1
minus 
select job from 部门2;
### SQL 中 UNION、UNION ALL、INTERSECTMINUS 的区别及用法 #### 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]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值