用 exists 和 not exists求集合的交集(intersection)和差集(except)及除法

本文介绍如何使用SQL语句中的exists和not exists来求两个表之间的交集和差集,通过具体实例演示了如何在MySQL环境下实现这些操作。

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

用 exists 和 not exists求集合的交集(intersection)和差集(except)及除法
(本文中所有SQL语句均在Mysql v5.1中验证)




求交集intersection和差集except可以用 (A in B 或 A exists B 或 =some)和 (A not in B 或 A not exists B 或 <>all)处理:如下


mysql> select * from a;
+------+------+---------------------+
| id   | name | Date                |
+------+------+---------------------+
|    1 | A1   | 2011-07-01 00:00:00 |
|    2 | A2   | NULL                |
|    3 | A3   | NULL                |
+------+------+---------------------+
3 rows in set (0.00 sec)


mysql> select * from b;
+------+------+------+
| id   | aid  | name |
+------+------+------+
|    1 |    1 | B1   |
|    2 |    2 | B2   |
|    3 |    2 | B3   |
+------+------+------+
3 rows in set (0.00 sec)




用exists求表a的id列和表b的aid列的交集(a.id ∩ b.aid)。
mysql> select id from a where  exists (select * from b where a.id=b.aid);
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)




用exists求表a的id列和表b的aid列的差集(a.id - b.aid):
mysql> select id from a where not exists (select * from b where a.id=b.aid);
+------+
| id   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)




求除法请参考另外一份文档:exists和not exists的嵌套使用及求关系的除法.txt
### SQL 中 Union、Intersection Difference 的区别与用法 #### Union 操作 `UNION` 是用于组合两个或多个 `SELECT` 语句的结果集的操作符。此操作会自动去除重复项,除非使用 `UNION ALL` 明确指定保留所有记录。 ```sql -- Example of UNION operation SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2; ``` 上述命令将返回来自 `table1` `table2` 的唯一值集合[^1]。 #### Intersection 操作 虽然标准 SQL 并不直接支持 `INTERSECTION` 关键字,但在某些数据库管理系统(DBMS)中实现了这一功能。对于那些未提供原生支持的 DBMS,可以借助子查询来实现相同的效果: ```sql -- Simulating INTERSECT using subqueries SELECT column_name(s) FROM table1 WHERE EXISTS ( SELECT * FROM table2 WHERE table1.column_name = table2.column_name); ``` 这段代码模拟了两表之间的交集运算,即只选取存在于两张表格中的共同元素[^3]。 #### Difference 操作 为了获取差集,在 SQL 中通常采用 `EXCEPT` 或者 `MINUS` 运算符(取决于具体的 RDBMS)。这些关键字用来找出第一个查询结果集中有而第二个查询结果集中没有的数据行。 ```sql -- Using EXCEPT to find elements present only in first set but not second one. SELECT column_name(s) FROM table1 EXCEPT SELECT column_name(s) FROM table2; ``` 这里展示了如何利用 `EXCEPT` 来计算 `table1` 对 `table2` 的相对补集,也就是仅属于前者而不属于后者的所有成员。 通过以上三种方式可以在不同场景下灵活处理数据集合间的逻辑关系,满足多样化的数据分析需
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值