MySQL如何实现两张表取差集
MySQL两张表取差集
业务场景如下:
人员表中有证件号、手机号字段,这两个字段因为涉及到个人隐私问题,因此加密存储,有另外一张解密表可以和人员表进行关联,查出解密后的证件号和手机号,现在需要统计出人员表中有多少没有加密的数据,进行再次加密处理,这个时候,考虑到的就是求两张表的差集,来找出未加密的人员。
求差集 SQL 脚本
select p.* from persons p left join CERT_CNO_PNO_TAB c ON c.PERSON_BUSINESS_ID = p.id where 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 表中的差集。
结果如下:

我们来验证一下,看看求得的这个差集,在解密表中是否真的不存在。
select * from CERT_CNO_PNO_TAB where PERSON_BUSINESS_ID = '0f551c3e03e34e449e5b2e31b64efdc5';
结果如下:

可以看出,通过 left join 再加上 右表的条件过滤取的的差集,是正确的。
这种求差集的效率,远比 not in 、not exist 要快的多,小伙伴们可以尝试一下!
MySQL查两个表之间的数据差集
需要查两个表之间的差集
首先,想到的是主键直接not in
select mailbox_id from co_user where mailbox_id not in (select mailbox_id from core_mailbox);
好吧!这个是可以,但是数据多了的话,想到这个查询的逻辑有点受不住
于是再改为下面的这样:
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进行筛选。
后面也在网上找了这条:
SELECT mailbox_id FROM `co_user` left join (select mailbox_id as i from core_mailbox) as t1 on co_user.mailbox_id= t1.i where t1.i is NULL;
概念上与第二条同理。
好吧! 回顾了一下left join
SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
MySQL数据时区问题以及datetime和timestamp类型存储的差异
这篇文章主要介绍了MySQL数据时区问题以及datetime和timestamp类型存储的差异,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-11-11
深入理解sqlserver中的字符编码、排序规则、nvarchar和varchar
本文主要介绍了深入理解sqlserver中的字符编码、排序规则、nvarchar和varchar,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-09-09
解读SQL中GROUP BY和HAVING子句中使用NULL条件问题
在使用SQL进行数据查询时,可能会遇到查询结果为空的情况,这通常与GROUP BY和HAVING子句的使用有关,尤其是在处理包含NULL值的字段时,当使用GROUP BY进行数据分组,并在HAVING子句中直接判断字段是否为NULL时2024-10-10
docker下mysql 8.0.20 安装配置方法图文教程
这篇文章主要介绍了docker下mysql 8.0.20 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2020-05-05


最新评论