为什么 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
.
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
决定将哪个聚合结果包含在最终结果中。
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
.
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
决定将哪个聚合结果包含在最终结果中。