loader
13 Aug , 2019

MySQL查询在A表不在B表的记录

author

xwdreamer 博客园

shape animated shape animated shape animated

使用第三方账号注册

使用手机号/邮箱注册

假设有A、B两张表。如果查询在A表中存在,但是在B表中不存在的记录,应该如何操作?

1、示例数据

假设A表数据:

MySQL查询在A表不在B表的记录

B表数据:

MySQL查询在A表不在B表的记录

其中,B表中的a_id是需要排除的A表的id。

这里我们要排除A表中id为3的记录,实际中可能有上万条记录。

2、子查询方法

一般我们首先想到的可能就是not in语句:

select A.* from A where A.id not in(select B.a_id from B);

这样可以查询出正确的结果。

但是如果B表很长,那么执行上述的查询语句,需要用A表中的字段去匹配B表中的每一个字段。

相当于是A表的每一个字段都要遍历一次B表,效率非常低下。

只要A中的字段不在B表中那么肯定要遍历完B表,如果A表中的字段在B表中,那么只要遍历到就退出,进行A表中下一个字段的匹配。

3、使用join方法

连接查询使我们平时进行sql查询用到最多的操作之一了。

相对于not in,使用连接查询的效率更高。

以下我们分步骤解析用join方法的过程。

因为我们需要搜索的是A表中的内容,所以第一步,我们使用A表左连接B表,如下:

select * from A left join B on A.id = B.a_id;

这样B表中会补null,查询结果:

MySQL查询在A表不在B表的记录

因为A、B两表中字段id相同,所以B表中的id字段变成了id1。

仔细观察可以发现,我们需要的结果集[1, 2, 4, 5]所对应的id1字段都是null。

这样,在查询语句中加入条件B.id is null,不就可以完成对只在A表中,但不在B表中的结果集的查询。

另外,我们只需要A表中的数据,B表的数据忽略。

于是最终变成:

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

结果就是:

MySQL查询在A表不在B表的记录

就是我们需要的结果,在A表中,但是不在B表中的记录。

这样做还有一个好处,如果A、B表的id、和B表的a_id都加了索引,那么join方式就能够命中索引。

而如果是子查询,在MySQL5.6之前的版本,就不会用到A表的索引,查询效率大大减慢。

以上就是关于“MySQL查询在A表不在B表的记录”的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流。

Tags:

Robin Binar Themeix

Onubia, turpis inceptos pharetra. Ipsum erat rutrum, luctus non rhoncus quam quisque posuere, eros pede leo facilisis at risus. Ea sit consectetuer suscipit pede hac purus, erat nec

猜你喜欢

WinSxS是什么,C盘WinSxS是什么文件夹?

11 Dec , 2018

2018-12-11 00:01

mac下安装composer,macos系统下全局安装composer

11 Dec , 2018

2018-12-11 00:11

区块链是什么,区块链到底是什么意思,看完这段话就懂了

11 Dec , 2018

2018-12-11 00:19

wireshark使用教程,网络抓包工具wireshark中文版使用教程

11 Dec , 2018

2018-12-11 00:48

VBS整人代码大集合,学会用VBS来编小程序对心仪的女神表白

11 Dec , 2018

2018-12-11 02:06

网友评论 ( 0 条评论 )

评论