我正在练习SQL,并意识到SQL中的 NULL 是非常令人惊奇的“ 实体”。
表“ xo ” Please see the link for table structure and contents
当我运行以下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 。
答案 0 :(得分:1)
这是因为在SQL中对NULL
进行了特殊处理。每当您将某项与NULL
进行比较时,它都会返回 unknown ,这将导致在NOT IN
条件下的比较失败。
这是为什么建议在EXISTS()
上使用NOT IN
的原因之一。
答案 1 :(得分:0)
请勿在子查询中使用MouseEvent
!当子查询返回一个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
返回FALSE或NOT IN
,因此所有行均被过滤掉。