繁体   English   中英

在以下情况下,SQL中的NULL如何工作?

[英]How does the NULL in SQL works in the below scenario?

我正在练习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);

它按照我的预测工作。

你能解释一下上面的事情是如何工作的吗? 如果您可以提供一些其他资源来真正理解NULL ,那将非常有帮助。

小提琴

这是因为NULL在SQL中被特殊对待。 每当您将某物与NULL比较时,它都会返回unknown ,这反过来又使NOT IN条件下的比较失败。

这是为什么建议在NOT IN上使用EXISTS()的原因之一。

小提琴

不要NOT IN子查询中使用NOT IN 当子查询返回NULL值时,它具有您看到的行为。 不返回任何行。

我强烈建议NOT EXISTSLEFT 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

因此,当任何值为NULLNOT IN将返回FALSE或NULL ,因此所有行都将被过滤掉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM