使用mysql IN和not IN运算符时的疏远行为

使用mysql IN和not IN运算符时的疏远行为,mysql,Mysql,我有一张100行的桌子a和一张200行的桌子。如果我这样做: select A.keya from A where A.keya not in (Select B.keyb from B) 我得到0个结果。然后我就跑 select A.keya from A where A.keya in (Select B.keyb from B) 我得到了50个结果 我是不是在接线员那里漏掉了什么?。Keya和keyb是Varchar字段 第一个查询不应该返回150个条目吗 thx我在这里能想到

我有一张100行的桌子a和一张200行的桌子。如果我这样做:

select A.keya 
from A 
where A.keya not in (Select B.keyb from B)
我得到0个结果。然后我就跑

select A.keya 
from A 
where A.keya in (Select B.keyb from B)
我得到了50个结果

我是不是在接线员那里漏掉了什么?。Keya和keyb是Varchar字段

第一个查询不应该返回150个条目吗


thx

我在这里能想到的唯一解释是A表中的100个值中有50个是空的。对于空值,以下两个表达式都将始终失败:

WHERE NULL NOT IN (SELECT keyb FROM B)
WHERE NULL IN (SELECT keyb FROM B)

因此,如果50个keya值匹配,那么您的第二个查询结果将是预期的。但是对于第一个查询,50个匹配值将失败,空值也将失败。

我能想到的唯一解释是A表中的100个值中有50个是空的。对于空值,以下两个表达式都将始终失败:

WHERE NULL NOT IN (SELECT keyb FROM B)
WHERE NULL IN (SELECT keyb FROM B)
因此,如果50个keya值匹配,那么您的第二个查询结果将是预期的。但是对于第一个查询,50个匹配值将失败,空值也将失败。

not in与in不相反

从a中选择a.keya,其中a.keya不在“a”、“b”中

从中选择a.keya,其中a.keya!='a'和a.keya!='b'

如果a.keya为空,则a.keya!='a'未知,那么a.keya不在a'中,b'未知

所以你的问题是,在b.keyb中有一个或多个NULL。因此,所有a.keya不在b中,请从b结果中选择b.keyb未知。结果为0。

不在与在不相反

从a中选择a.keya,其中a.keya不在“a”、“b”中

从中选择a.keya,其中a.keya!='a'和a.keya!='b'

如果a.keya为空,则a.keya!='a'未知,那么a.keya不在a'中,b'未知


所以你的问题是,在b.keyb中有一个或多个NULL。因此,所有a.keya不在b中,请从b结果中选择b.keyb未知。结果为0。

keya和keyb不为空:-然后您需要通过向我们展示一些数据使您的问题重现,我们可以自己测试这些数据。更好的办法是,设置一个演示并将链接粘贴到您的问题中。在这一点上,我甚至怀疑你对你认为你目前拥有的数据的分析。。。。不知怎的,我找到了一行,只有一行,keyb的值为空。。。一切都失败了!我想我现在明白了。该空值导致与子查询进行比较的所有内容都失败。keya和keyb不为空:-那么您需要通过向我们显示一些数据使您的问题重现,我们可以自己测试这些数据。更好的办法是,设置一个演示并将链接粘贴到您的问题中。在这一点上,我甚至怀疑你对你认为你目前拥有的数据的分析。。。。不知怎的,我找到了一行,只有一行,keyb的值为空。。。一切都失败了!我想我现在明白了。该空值导致与子查询比较的所有内容都失败。