请解释SQL中元组的含义是什么?谢谢。
这里大多数答案都在正确的方向上。然而,行并不是元组。 元组*
是一组具有名称的已知值的无序集合。因此,以下元组是相同的东西(我使用一个想象中的元组语法,因为关系元组在很大程度上是一个理论构建):
(x=1, y=2, z=3)
(z=3, y=2, x=1)
(y=2, z=3, x=1)
假设x、y和z都是整数,那么这些元组相等,而且它们是同一个东西,因为元组中没有重复的元素。最后,元组只能包含已知值(因此,不能包含空值)。
行**
是具有名称(尽管它们可能被省略)的已知或未知值的有序集合。在SQL中,以下比较会返回false:
(1, 2, 3) = (3, 2, 1)
(3, 1, 2) = (2, 1, 3)
请注意,有方法可以“假装”它完成了。例如,考虑以下INSERT
语句:
INSERT INTO point VALUES (1, 2, 3)
假设x是第一,y是第二,z是第三,那么这个查询可以重写为:
INSERT INTO point (x, y, z) VALUES (1, 2, 3)
或者这样:INSERT INTO point (y, z, x) VALUES (2, 3, 1)
...但我们真正做的只是改变排序,而不是删除它。
还要注意可能存在未知值。因此,您可能会有带有未知值的行:
(1, 2, NULL) = (1, 2, NULL)
请注意,此比较始终将产生UNKNOWN
。 毕竟,你怎么知道两个未知的值是否相等呢?
最后,行可能会重复。换句话说,(1, 2)
和(1, 2)
可能相等,但并不一定意味着它们是同一个东西。
如果您对此有兴趣,我强烈推荐阅读CJ Date的SQL and Relational Theory: How to Write Accurate SQL Code。
*
请注意,我谈论的是在关系模型中存在的元组,这与一般的数学略有不同。
**
而且,如果你想知道,几乎在SQL中的所有内容都是行或表。 因此,(1, 2)
是一行,而VALUES (1, 2)
是一个表(只有一行)。
更新:我在这里的博客文章中稍微扩展了这个答案。
这是“N元组”的缩写(例如“quadruple”,“quintuple”等)
它是作为一个整体从行集中取出的一行。
如果您发出以下命令:
SELECT col1, col2
FROM mytable
整个结果将是一个ROWSET
,每一对col1,col2
将成为一个tuple
。
有些数据库可以将元组作为一个整体来处理。
例如,您可以这样做:
SELECT col1, col2
FROM mytable
WHERE (col1, col2) =
(
SELECT col3, col4
FROM othertable
)
检查一个 rowset
中的整个 tuple
是否与另一个 rowset
中的整个 tuple
匹配。
元组 = 1 条记录;n-元组 = 'n' 条记录的有序列表;Elmasri Navathe 书(第三版第198页)。
记录可以是有序或无序的。
从数据库表中获取行数据
元组用于指代关系型数据库模型中的一行数据,但是元组与行有一些微小的差别。
元组用于定义立方体中的数据切片;它由一个或多个维度中的一个成员的有序集合组成。元组用于标识立方体中多维数据的特定部分;由立方体中每个维度的一个成员组成的元组完全描述了单元格的值。
(x=1, y=2, z=3)
是一个元组还是三个元组? - Rafael Eyng=
,则会更有帮助,因为该运算符会特殊处理空值NULL。例如,在先前表达式和表示之间的区别中,x = y
并不意味着x等于y。 - philipxy