相关疑难解决方法(0)

为什么 ANSI SQL 将 SUM(无行)定义为 NULL?

ANSI SQL标准定义(第6.5章,集功能规范),用于空的结果集的集合函数以下行为:

COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL
Run Code Online (Sandbox Code Playgroud)

为 AVG、MIN 和 MAX 返回 NULL 非常有意义,因为空集的平均值、最小值和最大值是未定义的。

然而,最后一个让我感到困扰:在数学上,空集的 SUM 是明确定义的:0。使用 0,加法的中性元素,作为基本情况使一切保持一致:

SUM({})        = 0    = 0
SUM({5})       = 5    = 0 + 5
SUM({5, 3})    = 8    = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL
Run Code Online (Sandbox Code Playgroud)

定义SUM({})null基本上使“无行”成为不适合其他行的特殊情况:

SUM({})     = NULL  = NULL
SUM({5})    = 5    != …
Run Code Online (Sandbox Code Playgroud)

null aggregate relational-theory sql-standard

30
推荐指数
1
解决办法
7131
查看次数

此查询的正确结果是什么?

在这里的评论中遇到了这个难题

CREATE TABLE r (b INT);

SELECT 1 FROM r HAVING 1=1;
Run Code Online (Sandbox Code Playgroud)

SQL ServerPostgreSQL返回 1 行。

MySQLOracle返回零行。

哪个是正确的?或者两者都同样有效?

aggregate sql-standard

20
推荐指数
2
解决办法
825
查看次数

标签 统计

aggregate ×2

sql-standard ×2

null ×1

relational-theory ×1