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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM