在下面的场景中,sql中的null是如何工作的?

fdbelqdn  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(256)

我正在练习sql,并且意识到sql中的null是非常惊人的“实体”。
表“xo”请参见表结构和内容的链接
当我运行以下sql查询时

select a from xo where a not in (select c from xo) ;

它不返回任何行。当我运行此查询时

select a from xo where a  in (select c from xo);

就像我预测的那样。
你能解释一下上面的事情是怎么运作的吗?如果您能提供一些额外的资源来真正理解空值,这将非常有帮助。
小提琴

neskvpey

neskvpey1#

不要使用 NOT IN 有子查询!当子查询返回 NULL 价值,它有你看到的行为。不返回任何行。
我强烈建议 NOT EXISTS 或者 LEFT JOIN / WHERE 因为这个原因。所以:

select a
from xo
where not exists (select 1 from xo xo2 where xo2.c = xo.a);

这将返回以下内容的补码:

select a
from xo
where exists (select 1 from xo xo2 where xo2.c = xo.a);

发生这种情况的技术原因是 NULL 是未知值,不是特殊值。所以:

1 in (1, 2, 3) returns TRUE
1 not in (1, 2, 3) returns FALSE

但是:

1 in (1, 2, 3, NULL) returns TRUE, because 1 is explicitly in the list
1 in (2, 3, NULL) returns NULL (equivalent to FALSE) because `NULL` could be 1 or not

以及:

1 not in (1, 2, 3, NULL) returns FALSE because 1 is explicitly in the list
1 not in (2, 3, NULL) returns NULL, because 1 could be in the list

所以,当任何值 NULL , NOT IN 返回false或 NULL --因此,所有行都被过滤掉。

noj0wjuj

noj0wjuj2#

这是因为 NULL 在sql中,s被特别处理。当你把某件事和 NULL 它返回unknown,这反过来又使比较失败 NOT IN 条件。
这是建议使用的原因之一 EXISTS() 结束 NOT IN .
小提琴

相关问题