[英]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 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
,因此所有行都将被过滤掉。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.