MYSQL查询A表中不存在于B表中的所有符合条件的数据

Posted adolph2715

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL查询A表中不存在于B表中的所有符合条件的数据相关的知识,希望对你有一定的参考价值。

在开发过程中,总有一些需求是需要查看在A表中ID不存在于B表中的ID的情况:

下面有三种方法可以实现这一需求:

第一种:使用Not in 方法通过子查询的结果集来做过滤:

select * from A where 1=1 AND A.ID not inselect ID from  B )

这种情况最常见也是最容易理解的逻辑SQL代码,但是会有很多问题出现。

首先,这种情况是针对数据量比较小的情况使用的,原因在于IN 和 NOT IN并不是针对索引进行查询的,操作效率相对较慢。可以通过使用NOT EXISTS 关键字进行优化,相对IN来说EXISTS的效率要高一些,应该在开发过程中尽量少使用in,并改为left join左连接进行查询过滤。

其次,使用not in 会出现查询结果不符合预期的情况:(测试了很多遍发现原因是因为子查询结果集中存在NULL值)

所以在使用in的时候,需要注意下面两种情况:

1.在使用IN 和 NOT IN 时要注意 IN范围中有NULL和空值的情况

2.在where语句中考虑NULL的同时要考虑空字符串的情况

第二种:在卡法中最常见的left join 方法,实现数据的过滤。

SELECT * FROM A LEFT JOIN B ON A.Id=B.Id  WHERE 1=1 AND B.Id IS NULL; 

第三种:查询速度最快,在应用到插入数据时,可在避免重复插入相同数据时又可以获取较快的时效,速度比上两个快非常多,但是不常见。

SELECT * FROM A WHERE  1=1 AND (SELECT COUNT(1) FROM B WHERE A.Id=B.Id)=0;

 

以上是关于MYSQL查询A表中不存在于B表中的所有符合条件的数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL多表联查总结

关于full join 语句的性能问题 跪求大虾帮忙解决.

关于sql查询b表中存在,a表中不存在的数据

怎样一个表中的2个查询结果合并到一个表中的两列

SQLite查询选择另一个表中不存在的所有记录

excel 将所有符合条件的数据显示在另一表中