知识卡片

SQL行与元组的关键差异

普通读书笔记卡

内容

SQL的”行”和关系模型的”元组”经常被随意类比,但严格说二者并不一样,差异集中在 一个根本点上:行的分量有自左向右的排序,元组没有。因为这个排序,ROW(1,2)ROW(2,1)是两个不同的SQL行,而对元组来说属性顺序无所谓、这两种排列表示的 是同一个东西;正因为有序,SQL行的分量(”字段”)习惯上按位置而不是按名字识别—— 比如行('S1','Smith',20,'London')里第二个分量的值是’Smith’,但在逻辑上不能说 它是”SNAME分量”,只能说它是”第2个分量”。这个差异还带来一个具体后果:SQL至少要 包含一个分量,没有关系模型里0-元组(度为0的空元组)的对应物,也就是说SQL根本 没有”0-行”这种东西。左右有序性也让SQL多出了一类关系模型没有的比较能力——大多数 SQL布尔表达式实际上是按”行比较”而非”标量比较”定义的(哪怕看起来像STATUS=20 这样的简单比较,严格讲也是标量被隐式型转成度为1的行后再做行比较),因此SQL可以 支持(STATUS,CITY)>(20,'London')这种基于左右顺序的字典序比较,这在纯关系模型 里没有对应概念;但书中强调这种依赖列排序的</<=/>/>=比较运算符既没有 关系模型对应物又容易出错,建议只在比较度确实为1(真正的标量比较)时使用它们。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第3章"元组、关系、行、表" 3.2节"SQL中的行"(源文件:OEBPS/text00032.html) - 结论依据:原文明确"行与元组严格来讲并不一样,行对其分量有自左向右的排序,而 元组没有……SQL中的行至少包含一个分量,SQL没有关系模型中0-元组的对应物(没有 '0-行')……除非比较中各行的度都为1(即实际上的标量),否则就不要用'<''<=' '>'和'>='这些比较运算符;它们既依赖于自左向右的列排序,又没有关系模型中的 对应物,还非常容易出错"。 - 原始内容:行与元组严格来讲并不一样,行对其分量有自左向右的排序,而元组 没有……SQL没有关系模型中0-元组的对应物(没有"0-行")……除非比较中各行的度都 为1,否则就不要用"<""<="">"和">="这些比较运算符。