mysql 查询两张表的差集

今天在做一个小功能的时候,遇到了需要取两个表的差集,本来可以直接通过两次查表然后通过代码去处理。

由于我个人比较喜欢减少数据库交互,所以在网上查了下关于mysql两个表取差集的方案。但是发现很多的

差集的sql是有这两种方式:

第一种是通过not in的方式去处理:

select id from table_a where id not in (select id from table_b);

第二种则是通过左连接(left join)的方式:

select * from table_a as a     
    left join table_b as b       
        on a.id = b.id         
            where a.id is NULL;

本来我想着这样应该是可以的,后面我仔细思考了一下,发现这不像是差集,反而像是主表存在副表不存在的差集,

但是主表不存在副表存在的数据却没有过滤出来,即查出来的数据是主表独有,说明这不是完整的两个表差集的获取。

附上AB表交差并集等的图片(图片是网上找的)

image.png

上面两种方法都是取的A在B表的差集,而我想要的是最下面右边的结果

那么该怎么办,我原本打算是直接用全连接(full join)来处理。

但是MySQL却没有提供全连接,所以要做差集处理需要做其他处理

但是从上图可以看出,取AB表的差集,就是拿A表独有数据跟B表独有数据合并

那么思路就有了,直接通过union将两个查询的结果合并即可。

select * from A left join B on A.id = B.id where B.id is nullunion select * from A right join B on A.id = B.id where A.id is null;

这种方式其实也可以弄成两个sql查询,通过代码去处理。

但是我个人比较倾向于减少数据库的交互,所以采用这种方式。

当然,如果有更好的方法就更好了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容