MySQL如何實現(xiàn)兩張表取差集
目錄
- MySQL兩張表取差集
- 求差集 SQL 腳本
- MySQL查兩個表之間的數(shù)據(jù)差集
- SQL LEFT JOIN 關(guān)鍵字
- 總結(jié)
MySQL兩張表取差集
業(yè)務(wù)場景如下:
人員表中有證件號、手機號字段,這兩個字段因為涉及到個人隱私問題,因此加密存儲,有另外一張解密表可以和人員表進行關(guān)聯(lián),查出解密后的證件號和手機號,現(xiàn)在需要統(tǒng)計出人員表中有多少沒有加密的數(shù)據(jù),進行再次加密處理,這個時候,考慮到的就是求兩張表的差集,來找出未加密的人員。
求差集 SQL 腳本
select p.* from persons pleft join CERT_CNO_PNO_TAB c ON c.PERSON_BUSINESS_ID = p.idwhere p.`status` = "person.status.allow.yes" and p.del_flag = "0"and c.id is null;
注意看,where 語句的最后一個條件。通過 left join 連表之后,再使用右表的 c.id is null 來進行過濾,最終可以得到 person 表與 CERT_CNO_PNO_TAB 表中的差集。
結(jié)果如下:
我們來驗證一下,看看求得的這個差集,在解密表中是否真的不存在。
select * from CERT_CNO_PNO_TAB where PERSON_BUSINESS_ID = "0f551c3e03e34e449e5b2e31b64efdc5";
結(jié)果如下:
可以看出,通過 left join 再加上 右表的條件過濾取的的差集,是正確的。
這種求差集的效率,遠比 not in 、not exist 要快的多,小伙伴們可以嘗試一下!
MySQL查兩個表之間的數(shù)據(jù)差集
需要查兩個表之間的差集
首先,想到的是主鍵直接not in
select mailbox_id from co_user where mailbox_id not in (select mailbox_id from core_mailbox);
好吧!這個是可以,但是數(shù)據(jù)多了的話,想到這個查詢的邏輯有點受不住
于是再改為下面的這樣:
select cu.mailbox_id,cm.mailbox_id from co_user as cu? left join core_mailbox as cm? on cu.mailbox_id = cm.mailbox_id? where cm.mailbox_id is NULL;
利用了left join的,然后進行對比,并且利用where進行篩選。
后面也在網(wǎng)上找了這條:
SELECT mailbox_id FROM `co_user` left join?(select mailbox_id as i from core_mailbox) as t1on co_user.mailbox_id= t1.i where t1.i is NULL;
概念上與第二條同理。
好吧! 回顧了一下left join
SQL LEFT JOIN 關(guān)鍵字
LEFT JOIN 關(guān)鍵字會從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持。
