为什么 SQL NOT EXISTS return 1 条所有 NULL 值的记录

Why does SQL NOT EXISTS return 1 record of all NULL values

SQL Fiddle 以下内容:

create table tbl( col1 int, col2 int, col3 int);
insert into tbl values(1,1,1);
insert into tbl values(1,1,1);

select sum(col1) c1, sum(col2) c2, sum(col3)c3
from tbl
where not exists (
  select 2 as c1, 2 as c2, 2 as c3
  )

我希望这有 return 0 条记录。相反,它 returns 1 条空值记录。你能告诉我为什么吗?

P.s。我试图了解不存在的行为。

这与 EXISTS 无关。您的 NOT EXISTS 计算结果为 FALSE,因为 SELECT 2 AS c1, 2 AS c2, 2 AS c3 总是 return 一行。这意味着您的查询等同于:

SELECT SUM(col1) c1, SUM(col2) c2, SUM(col3) c3 FROM tbl WHERE 0

说起来,这其实是关于SUM语义的。 SUM 即使在一个空集合中也应该 return 一个值,在这种情况下的值是 NULL.

来自mysql documentation

SUM(expr)

Returns the sum of expr. If the return set has no rows, SUM() returns NULL.

SUM() returns NULL if there were no matching rows.

除了 JuniorCompressor 指出的内容之外,重要的是要注意查询中 SQL 子句的执行顺序。 WHERE 首先运行,然后是 SELECT 列表,其中正在计算 空结果集 的聚合,其结果为空,因为它们没有要处理的内容。

要真正按照您的预期丢弃该结果,您需要一个 HAVING 子句,它会在之后运行,并且可以根据聚合结果过滤掉。

差异很微妙,但却是这个问题的重点。 WHERE 决定哪些原始行有资格集成聚合。 HAVING 决定将哪个聚合结果包含在最终结果中。