关系数据库中"元组"一词的含义是什么?

War*_*ior 58 sql rdbms tuples terminology definition

请解释一下sql中的元组是什么意思?谢谢..

Jas*_*ker 80

这里的大多数答案都在正确的轨道上.但是,一行不是元组. 元组*是带有名称的无序已知值集.因此,以下元组是相同的(我使用虚构的元组语法,因为关系元组主要是理论构造):

(x=1, y=2, z=3)
(z=3, y=2, x=1)
(y=2, z=3, x=1)
Run Code Online (Sandbox Code Playgroud)

...当然假设x,y和z都是整数.还要注意,没有"重复"元组这样的东西.因此,不仅上述相同,它们是相同的.最后,元组只能包含已知值(因此,没有空值).

**是一组有序的已知或未知的值与名称(尽管它们可被省略).因此,以下比较在SQL中返回false:

(1, 2, 3) = (3, 2, 1)
(3, 1, 2) = (2, 1, 3)
Run Code Online (Sandbox Code Playgroud)

请注意,有一些方法可以"伪造它".例如,请考虑以下INSERT声明:

INSERT INTO point VALUES (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

假设x是第一个,y是第二个,z是第三个,这个查询可能会被重写为:

INSERT INTO point (x, y, z) VALUES (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

或这个:

INSERT INTO point (y, z, x) VALUES (2, 3, 1)
Run Code Online (Sandbox Code Playgroud)

...但我们所做的只是改变排序而不是删除它.

并且还注意到可能还存在未知值.因此,您可能拥有未知值的行:

(1, 2, NULL) = (1, 2, NULL)
Run Code Online (Sandbox Code Playgroud)

...但请注意,这种比较总会产生UNKNOWN.毕竟,你怎么知道两个未知值是否相等?

最后,行可能会重复.换句话说,(1, 2)并且(1, 2)可以比较相等,但这并不一定意味着它们是相同的.

如果这是您感兴趣的主题,我强烈建议您阅读SQL和关系理论:如何通过CJ Date 编写准确的SQL代码.

* 请注意,我在谈论元组,因为它们存在于关系模型中,这与一般的数学有点不同.

**如果您想知道,SQL中的所有内容都是行或表.因此,(1, 2)是一行,VALUES (1, 2)而是一个表(有一行).

更新:我在这里的博客文章中对这个答案进行了一些扩展.

  • 您好,我已经阅读了您的答案,我已经在SO上阅读了类似的答案(Mike Samuel在[此问题](http://stackoverflow.com/questions/4212265/tuples-vs-records/679449)和sampson-chen在[那个问题](http://stackoverflow.com/questions/13057663/what-is-the-difference-between-a-row-record-and-tuple))以及[这里](http:// www.techopedia.com/definition/1251/tuple-database)和[wiki](http://en.wikipedia.org/wiki/Tuple),并且都说元组是**有序的**集合,而不是无序的.因此你的答案让我困惑. (7认同)
  • 默认情况下,此答案无法区分数学(有序)与关系数据库上下文(无序名称-值对集)中术语“元组”的不同含义。如果您区分表达式所表示的内容,这也会有所帮助。例如,“1/2”和“3/6”是两种不同的表达方式,表示分数值的二分之一,即 1/2。如果您区分值的相等性和 SQL 运算符 `=`,它会特别地处理值 NULL,这也会有所帮助。例如,根据前面表达式和外延之间的区别,`x = y` 并不意味着 x 等于 y。 (2认同)

Qua*_*noi 14

这是一个缩短的" N-tuple"(如在quadruple,quintuple等等)

这是一行整行的行集.

如果您发出:

SELECT  col1, col2
FROM    mytable
Run Code Online (Sandbox Code Playgroud)

,整个结果将是一个ROWSET,而每一对都col1, col2将是一个tuple.

有些数据库可以作为一个整体使用元组.

喜欢,你可以这样做:

SELECT  col1, col2
FROM    mytable
WHERE   (col1, col2) =
        (
        SELECT  col3, col4
        FROM    othertable
        )
Run Code Online (Sandbox Code Playgroud)

,检查一个整体tuple从一个rowset整体匹配tuple从另一个rowset.