mysql select in/not in 中存在 null 的影响

select TRUE ;//true
select FALSE;//false
select TRUE and null; //null
select FALSE and null; //null
select TRUE or null; //true
select FALSE or null; //null
select null=null; //null
select null!=null; //null
当执行 select in 语句时,实际执行 or 运算,其中一个为 true,则结果为 true,所以有匹配项则会返回匹配结果。

当执行 select not in 语句时,实际执行 and 运算,任何值与 null 进行 and 运算返回都为 null,则结果不为 true,既不反回匹配项。

例如:
tb_source 执行 in 运算时,tb_source 中的值依次与 tb_target 中的值进行 "=" 运算,其中一个为 true,则返回匹配项。
tb_source 执行 in 运算时,tb_source 中的值依次与 tb_target 中的值进行 "!=" 运算,其中一个值为 null 则最终结果为 null,不为 true,无返回项。
表 :tb_source:
bf7d1da406ce4d97b0b2c3eec2d526c3_image.png

表 :tb_target:
2db1e9d7d9a54412af9d761cda83c2b8_image.png

select a from tb_source where a in (select b from tb_target)
结果为 :
7a43a16e074541689f7d7eebadc61db3_image.png

select a from tb_source where a not in (select b from tb_target)
结果为:
f2ef8142ef8749b094559833e8a423bc_image.png

当在 tb_target 中插入一条 null 数据时再次进行查询:
select a from tb_source where a in (select b from tb_target)
结果为:
1240be7674d64e2a9ce2daef9accfbac_image.png

select a from tb_source where a not in (select b from tb_target)
结果为:
da56a9694a2e494da12de82d52b99d7a_image.png