知识卡片

SQL对空集合处理的系统性缺陷清单

结构图卡

内容

空集合(不包含元素的集合)在关系模型里是一个极其重要、行为完全普适一致的 基础概念([[TABLE_DUM与TABLE_DEE关系代数中的0]]正是这份普适性最极致的 体现),但SQL在处理空集合的方式上散布着大量彼此不一致的特设规则,本节把 全书已经零散讨论过的多处空集合问题汇总成一份清单:VALUES表达式不允许空的 行表达式列表;SQL”集合函数”在参数为空时返回NULL(COUNT和COUNT(*)例外, 正确返回0,呼应[[SQL聚集运算符的三重缺陷]]);标量子查询结果为空表时型转 为NULL,行子查询结果为空表时型转为全NULL的一行(呼应[[子查询三分类及空表 型转规则]]);GROUP BY作用于分组列和被分组表都为空的情况时,理应产生 “零个分组”的结果,实际却产生”恰好一个(本质为空的)组”这个特例(呼应 [[SQL聚集运算符的三重缺陷]]);键不能是空的列集合(外键更不行);表不能 有空标题(呼应[[TABLE_DUM与TABLE_DEE关系代数中的0]]里”SQL没有0-元组、 没有TABLE_DUM/TABLE_DEE对应物”这条缺陷);SELECT项列表不能为空;FROM项 列表不能为空;UNION/INTERSECT/EXCEPT CORRESPONDING里公共列的集合不能为空 (但JOIN本身可以没有公共列,即退化成积);一行中不能有空的分量集合(即 SQL没有[[TABLE_DUM与TABLE_DEE关系代数中的0]]里0-元组的对应物)。这份清单 的价值不在于每一条本身的技术细节,而在于它把全书散落在各章的”SQL处理空 集合时的特设行为”集中呈现,让读者一次性看清SQL在这个基础概念上有多不 一致——书中坦承对大多数这类问题读者无能为力(这是SQL标准本身的设计缺陷), 但至少应该清楚知道这些坑分别在哪里。

结构图

flowchart TD
    A[空集合在SQL中的处理] --> B["VALUES不允许空行列表"]
    A --> C["集合函数(除COUNT)在空参数下返回NULL<br/>而非恒等值"]
    A --> D["标量/行子查询结果为空<br/>型转为NULL/全NULL行"]
    A --> E["GROUP BY空表<br/>产生1个空组而非0个组"]
    A --> F["键/外键不能是空列集合<br/>表不能有空标题"]
    A --> G["SELECT/FROM项列表不能为空"]
    A --> H["CORRESPONDING公共列不能为空<br/>(JOIN例外)"]
    A --> I["行不能有空分量集合<br/>即无0-元组对应物"]

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第12章"关于SQL的 其他主题"12.7节"空集合"(源文件:OEBPS/text00140.html) - 结论依据:原文明确"空集合是不包含元素的集合。在关系的世界中,此概念是 极其重要的普适概念。然而,SQL却对此概念犯了很多错误……我们对于大多数 错误都无能为力,不过至少我们应该知道有哪些错误",并逐条列出VALUES、 集合函数、子查询型转、GROUP BY、键、表标题、SELECT/FROM列表、 CORRESPONDING、行分量集合等多处具体缺陷。 - 原始内容:空集合是不包含元素的集合。在关系的世界中,此概念是极其重要 的普适概念。然而,SQL却对此概念犯了很多错误……我们对于大多数错误都 无能为力,不过至少我们应该知道有哪些错误。