本文已参与「新人创作礼」活动,一起开启掘金创作之路。
需求描述
两个数据表,字段数不同,存储数据不同,求两表的差集
需求分析
首先,我们可以先在自己的mysql中按照需求建立两张表。
表exa:
表exb:
求exa表和exb表的差集,相当于返回一个id集合包含00003、00004和00005。
两种解决方法:
- NOT EXISTS
not exists在比对字段有可利用的索引时,其运行效率是非常高,但是如果没有索引的情况下运行在大数据表时,其运行效率极差,这时应避免使用它
SELECT
*
FROM
exb b
WHERE
NOT EXISTS ( SELECT id FROM exa a WHERE b.id = a.id );
返回结果:
- 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 来进行过滤
同样也可以得到我们想要的结果:
求差集的两种方法,有索引可利用时,not exists的效率要高于left join,反之left join效率更好
mysql内连接、左连接和右连接的区别
| 关键字 | 名称 | 描述 |
|---|---|---|
| inner join | 内连接 | 结合两张表的记录,返回的是两张表的交集部分 |
| left join | 左连接 | 左表的信息全部都展示出来,右表只会展示相关联的信息,不足的地方记为NULL |
| right join | 右连接 | 右表的信息全部展示出来,左表只会展示相关联的信息,不足的地方记为NULL |