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。我试图理解不存在的行为。
答案 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
。
SUM(表达式)
返回expr的总和。如果返回集没有行,则SUM()返回NULL。
如果没有匹配的行,则SUM()返回NULL。
答案 1 :(得分:1)
除了JuniorCompressor指出的内容之外,注意查询中SQL子句的执行顺序也很重要。首先运行WHERE
,然后运行SELECT
列表,其中在空结果集上计算聚合,其结果为null,因为它们无需处理任何内容。
要按预期实际丢弃该结果,您需要一个HAVING
子句,该子句在之后运行,并且可以根据聚合结果过滤掉。
差异很微妙,但却是这个问题的重点。 WHERE
决定哪些原始行有资格整合聚合。 HAVING
决定将哪个汇总结果包含在最终结果中。