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

时间:2018-11-14 17:44:16

标签: mysql sql database null

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

Fiddle

2 个答案:

答案 0 :(得分:1)

这是因为在SQL中对NULL进行了特殊处理。每当您将某项与NULL进行比较时,它都会返回 unknown ,这将导致在NOT IN条件下的比较失败。

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

Fiddle

答案 1 :(得分:0)

请勿在子查询中使用MouseEvent!当子查询返回一个NOT IN值时,它具有您看到的行为。不返回任何行。

出于这个原因,我强烈建议使用NULLNOT 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,因此所有行均被过滤掉。