AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 25435
Accepted
Heinzi
Heinzi
Asked: 2012-10-05 08:49:05 +0800 CST2012-10-05 08:49:05 +0800 CST 2012-10-05 08:49:05 +0800 CST

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

  • 772

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

COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL

为 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

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

SUM({})     = NULL  = NULL
SUM({5})    = 5    != NULL + 5 (= NULL)
SUM({5, 3}) = 8    != NULL + 5 + 3 (= NULL)

我错过的选择是否有一些明显的优势(SUM 为 NULL)?

null aggregate
  • 3 3 个回答
  • 7346 Views

3 个回答

  • Voted
  1. Best Answer
    Erwin Smout
    2012-10-05T14:12:15+08:002012-10-05T14:12:15+08:00

    恐怕原因很简单,在 SQL 聚合及其与数学的联系不如现在理解的时候,这些规则是以一种临时方式设置的(就像ISO SQL 标准的许多其他“特性”一样) (*)。

    这只是 SQL 语言中极多的不一致之处之一。它们使语言更难教、更难学习、更难理解、更难使用、更难实现你想要的任何东西,但事情就是这样。出于向后兼容性的明显原因,规则不能“冷”和“就那样”更改(如果 ISO 委员会发布标准的最终版本,然后供应商开始实施该标准,那么这些供应商将不会欣赏如果在后续版本中,规则会发生更改,使得标准的前一版本的现有(兼容)实现“自动不符合”新版本......)

    (*) 现在可以更好地理解,如果它们系统地返回手头底层二元运算符的标识值(= 你所谓的“中性元素”),则空集上的聚合行为会更加一致。COUNT 和 SUM 的底层二元运算符是加法,其标识值为零。对于 MIN 和 MAX,如果相关类型是有限的,则该标识值分别是当前类型的最高和最低值。不过,在这方面,平均、调和平均值、中位数等情况非常复杂和奇特。

    • 20
  2. Leigh Riffel
    2012-10-06T05:31:23+08:002012-10-06T05:31:23+08:00

    在务实的意义上,现有的结果NULL是有用的。考虑下表和语句:

    C1 C2
    -- --
     1  3 
     2 -1 
     3 -2 
    
    SELECT SUM(C2) FROM T1 WHERE C1 > 9;
    
    SELECT SUM(C2) FROM T1 WHERE C1 < 9;
    

    第一条语句返回 NULL,第二条语句返回 0。如果一个空集返回零,SUM我们将需要另一种方法来区分真正的零和与空集,也许使用计数。如果我们确实希望空集为零,那么一个简单的COALESCE函数将满足该要求。

    SELECT COALESCE(SUM(C2),0) FROM T1 WHERE C1 > 9;
    
    • 3
  3. TToni
    2012-10-06T02:53:03+08:002012-10-06T02:53:03+08:00

    我可以看到的主要区别在于数据类型。COUNT 有一个明确定义的返回类型:一个整数。所有其他都取决于他们正在查看的列/表达式的类型。它们的返回类型必须与集合的所有成员兼容(想想浮点数、货币、小数、bcd、时间跨度……)。由于没有集合,您不能暗示返回类型,因此 NULL 是您的最佳选择。

    注意:在大多数情况下,您可以从正在查看的列类型中暗示返回类型,但是您不仅可以对列进行求和,还可以对所有类型的事物进行求和。在某些情况下,如果不是不可能的话,暗示返回类型可能会变得非常困难,尤其是当您考虑标准的可能扩展时(想到动态类型)。

    • -1

相关问题

  • 每个子集的 MAX

  • 如何对 Oracle 数据库表进行水平分区,我应该这样做吗?

  • 计算一行占总和的百分比

  • 默认为 NULL 还是 NOT NULL?

  • 何时使用 NULL 以及何时使用空字符串?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve