知识卡片
ORDER BY不是关系运算符:它不是函数
内容
[[关系是n维的而非二维的]]与[[关系的五条性质与SQL表为何不是关系]]里已提过
ORDER BY不是关系运算符(结果不是元组集合而是元组序列),本节进一步指出ORDER
BY还有一个更本质的问题——它甚至不是一个函数。本书描述的所有真正的关系代数
运算符本质上都是函数:给定确定的输入,永远产生确定的输出。ORDER BY却违反了
这条最基本的要求:对同一个输入关系,它可以合法地产生多个不同的输出。书中用
具体例子说明——即使没有为元组定义”<“和”>“,ORDER BY CITY依然能对供应商关系
产生某种确定的排列,但当排序键出现取值相同的元组(比如两个供应商同城市)时,
这些元组彼此的相对顺序完全没有被规定,针对常用样例数据的ORDER BY CITY至少
可以合法产生4种不同顺序的结果,每一种在SQL语义上都同样正确——这直接说明
ORDER BY作为一个”运算符”根本不满足函数”确定输入对应确定输出”这一最低要求。
这个问题还有一个更深层的呼应:本书描述的关系代数运算符本身都是函数,但它们
在SQL里的绝大多数对应物同样不是函数——[[SQL字符序与相等但可区分的值]]里已
说明,因为SQL允许”相等但可区分”的值对(比如’Paris’和’Paris ‘因PAD SPACE而
比较相等),像SELECT DISTINCT CITY FROM S这类看似简单的查询,在存在这类
“相等但可区分”的取值时,结果到底会保留哪一个具体值也是未定义的——SQL甚至
允许同一个查询在数据库完全没有任何改变的情况下,今天返回一个结果、明天返回
另一个结果,这种”合法但不确定”的行为再次说明,把SQL运算符当作数学函数来理解
在很多场合下是不成立的。
参考来源
- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第7章"SQL和关系代数
II:附加运算符"7.13节"ORDER BY是怎么回事"(源文件:OEBPS/text00086.html)
- 结论依据:原文明确"ORDER BY实际上并不是关系代数的组成部分。事实上,它根本
就不是关系运算符,因为它产生的结果并不是关系……它不是函数……ORDER BY对于
同一输入可以产生多种不同的输出……此运算对应于下列运算次序可以返回4个不同
结果中的任何一个结果……尽管本书描述的关系代数运算符实际上是函数,但是它们
中的大部分在SQL中的对应物却不是函数……一些SQL表达式'可能是不确定的'"。
- 原始内容:ORDER BY实际上并不是关系代数的组成部分……它不是函数……ORDER BY
对于同一输入可以产生多种不同的输出……尽管本书描述的关系代数运算符实际上
是函数,但是它们中的大部分在SQL中的对应物却不是函数……一些SQL表达式
"可能是不确定的"。