知识卡片
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,否则就不要用"<""<="">"和">="这些比较运算符。