mysql两表求差集

1,585 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

需求描述

两个数据表,字段数不同,存储数据不同,求两表的差集

需求分析

首先,我们可以先在自己的mysql中按照需求建立两张表。

表exa:

image.png

表exb:

image.png

求exa表和exb表的差集,相当于返回一个id集合包含000030000400005

两种解决方法:

  1. NOT EXISTS 

not exists在比对字段有可利用的索引时,其运行效率是非常高,但是如果没有索引的情况下运行在大数据表时,其运行效率极差,这时应避免使用它

SELECT
    * 
FROM
    exb b 
WHERE
    NOT EXISTS ( SELECT id FROM exa a WHERE b.id = a.id );

返回结果:

image.png

  1. LEFT JOIN

用左(右)连接来求差集,由于需要实施两表连接会导致笛卡尔效应其输出集的记录行可能会增多,

若果不是一对一或一对多,我们应该将多对多的情况处理成多对一后才进行连接,否则输出的记录集可能不正确。

SELECT
    b.* 
FROM
    exb b
    LEFT JOIN exa a ON a.id = b.id 
WHERE
    a.created_time IS NULL;

通过 left join 连表之后,再使用右表的 a.created_time is null 来进行过滤

同样也可以得到我们想要的结果:

image.png

求差集的两种方法,有索引可利用时,not exists的效率要高于left join,反之left join效率更好

mysql内连接、左连接和右连接的区别

关键字名称描述
inner join内连接结合两张表的记录,返回的是两张表的交集部分
left join左连接左表的信息全部都展示出来,右表只会展示相关联的信息,不足的地方记为NULL
right join右连接右表的信息全部展示出来,左表只会展示相关联的信息,不足的地方记为NULL