,B表中没有。假设有A表和B表两个表,查询A表中存在,B表中不存在怎么办?示例数据假设A表数据:id12345B表数据:ida_id13其中B表中的a_id为需要排除的A表的id。这里我们要排除表A中id为3的记录,实际上可能有几万条记录。一般我们在子查询方法中首先想到的是notin语句:selectA.*fromAwhereA.idnotin(selectB.a_idfromB);这样就可以找到正确的结果。但是如果B表很长,那么要执行上面的查询语句,就需要用A表中的字段来匹配B表中的每个字段。相当于A表中的每个字段都要遍历一次B表,即非常低效。只要A表中的字段不在B表中,那么就必须遍历B表。如果A表中的字段在B表中,那么只要遍历完就退出,匹配A表中的下一个字段。使用join方式连接查询,使我们成为了SQL查询中使用频率最高的操作之一。与notin相比,使用join查询效率更高。下面我们一步步分析使用join方法的过程。因为我们要查找的是表A中的内容,所以第一步我们用表A左连接表B,如下:select*fromAleftjoinBonA.id=B.a_id;这样B表就补null,查询结果:idid1a_id1NULLNULL2NULLNULL3134NULLNULL5NULLNULL因为A表和B表的字段id相同,所以B表的id字段变成了id1。仔细观察发现,我们需要的结果集[1,2,4,5]对应的id1字段都是null。这样,如果在查询语句中加入条件B.id为null,就可以完成只存在于A表中,不存在于B表中的结果集的查询。另外我们只需要A表的数据,而忽略B表的数据。所以最后变成:selectA.*fromAleftjoinBonA.id=B.a_idwhereB.idisnull;结果是:id1245就是我们需要的结果,在A表中,但在B表Record中没有。这样做还有另一个好处。如果A、B表的id,B表的a_id都有索引,那么join方法就可以命中索引。而如果是子查询,MySQL5.6之前的版本,不会使用A表的索引,查询效率高
