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

h7wcgrx3  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(281)

我有一张100行的table和一张200行的table。如果我这样做了:

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个条目吗?
谢谢

bvjveswy

bvjveswy1#

not in 不是相反的 in . select a.keya from a where a.keya not in ('a', 'b') 与相同 select a.keya from a where a.keya != 'a' and a.keya !='b' 请参阅空比较:未知
如果a.keya为空,则a.keya!='是的 UNKNOWN ,那么 a.keya not in ('a', 'b')UNKNOWN .
所以你的问题是,在b.keyb中有一个或多个null。所以所有 a.keya not in (select b.keyb from b) 结果 UNKNOWN . 结果为0。

ufj5ltwl

ufj5ltwl2#

我能想到的唯一解释是,在你的 A table是 NULL . 为了 NULL 值时,以下两个表达式都将始终失败:

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

所以,如果50 keya 如果值匹配,则会出现第二个查询结果。但是对于第一个查询,50个匹配值将失败,并且 NULL 值也会失败。

相关问题