mysql:not in(子查询),子查询中存在Null值的情况分析与解决

探讨了在SQL查询中使用Not In时遇到的问题,特别是当子查询包含Null值时,Not In操作符可能返回意外的Null结果。文章分析了这一现象的原因,并提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

score1:

score2: 

当我们经常在where子句过滤条件中使用not in时 ,如:

 查询score1分数不在score2分数中的数据,:

select * from score1 where 成绩 not in (select 成绩 from score2);

可能会遇到where返回结果全为False的情况,即使确实不存在于子查询中,仍然返回为False

如下查询结果:

 由表格可知score1中存在成绩为77且不存在于score2表的成绩中的数据,可查询结果却为空;

我们使用:select 77 in (select 成绩 from score2);尝试查看返回的结果。

而: select 88 in (select 成绩 from score2);

由上可知,77 not in 返回null值, 而88 not in 返回 0值;

88 not in结果为0即假值符合我们的预期,而77 not in 理应返回1即真值,可却返回Null值 导致结果也为假值。

原因:

        当使用in时,具体实现过程是将每个值与结果集中的每个值进行对比,当你判断任意值a = null时, 官方说, "You cannot use arithmetic comparison operators such as =, <, or <> to test for NULL", 任何与null值的对比都将返回null而不是假值0。

         当询问 成绩 not in (select 成绩 from score2)时, 因为score2.成绩null值, 则77 in (88,82,88,93,null)的结果是(0,0,0,0,null),当集合中只有0与null时,程序会返回null而不是0假值,取not仍然为null;而88 not in 中仍然返回0,原因在于如88 in (88,82,88,93,null)的结果是 (1,0,1,0,null),则含有真值则覆盖null返回真值,然后取 not 才得到0的假值结果。

解决:

        只需要在not in的基础上加上 is  null判断即可,如下:

 由以上分析我们可知当我们想要的not in 返回真值时都会返回null而想要的not in 为假值仍然返回0,则只需要加上is null判断即可。

注:首先需确定子查询中是否含有Null值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小文大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值