zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    20100920 [随笔] -Roy
    20100826 [随笔] Roy
    20100820随笔Roy
    20100825 [随笔] -Roy
    博客园开博随笔
    Synchronized vs SyncRoot
    Exception vs ApplicationException
    Monitor用法
    捕获ASP.NET程序发生的异常
    理解ParseChildren用法
  • 原文地址:https://www.cnblogs.com/adolph2715/p/10921765.html
Copyright © 2011-2022 走看看