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

时间:2015-03-16 21:40:30

标签: mysql sql not-exists

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
  )

我希望这会返回0条记录。相反,它返回1个空值记录。你能告诉我为什么吗?

P.S。我试图理解不存在的行为。

2 个答案:

答案 0 :(得分:5)

不是EXISTS。您的NOT EXISTS评估为FALSE,因为SELECT 2 AS c1, 2 AS c2, 2 AS c3始终返回一行。这意味着您的查询等同于:

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

这样说,这实际上是关于SUM语义。 SUM即使在空集中也应该返回一个值,在这种情况下,值为NULL

来自mysql documentation

  

SUM(表达式)

     

返回expr的总和。如果返回集没有行,则SUM()返回NULL。

     

如果没有匹配的行,则SUM()返回NULL。

答案 1 :(得分:1)

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

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

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