关系型数据库中,“元组”这个术语是什么意思?

65

请解释SQL中元组的含义是什么?谢谢。

10个回答

86

这里大多数答案都在正确的方向上。然而,行并不是元组元组*是一组具有名称的已知值的无序集合。因此,以下元组是相同的东西(我使用一个想象中的元组语法,因为关系元组在很大程度上是一个理论构建):

(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)是一个表(只有一行)。

更新:我在这里的博客文章中稍微扩展了这个答案。


9
你好,我已经阅读了你的回答以及在 SO 上类似的回答(Mike Samuel 在 这个问题 和 sampson-chen 在 那个问题),以及 这里维基百科,它们都说元组是有序集合,而不是无序的。因此,你的回答让我感到困惑。 - Lou
我现在正在浏览这个,但是如果一行具有唯一的主键,那么不管如何排序,这不是使每一行都独一无二吗? - jwknz
基本问题:(x=1, y=2, z=3) 是一个元组还是三个元组? - Rafael Eyng
我不明白为什么在SQL中 (1, 2, 3) = (3, 2, 1) 不相等,这是一件坏事吗?我的意思是,假设 x=3,y=2,z=1,它们肯定是两个不同的东西。我认为如果你在SQL示例中不省略名称,答案可能会更清楚。即使我读了你的博客,我还是很困惑。 - Vincent Paing
2
此答案默认情况下未能区分“元组”一词在数学(有序)和关系数据库上下文(无序名称-值对集合)中的不同含义。如果您区分表达式及其所表示的内容,将会更有帮助。例如,“1/2”和“3/6”是两个不同的表达式,它们表示分数值的一半,即1/2。如果您区分值的相等性和SQL运算符=,则会更有帮助,因为该运算符会特殊处理空值NULL。例如,在先前表达式和表示之间的区别中,x = y并不意味着x等于y。 - philipxy

15

这是“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 匹配。


4
在关系型数据库中,表是关系(在数学意义上)。关系是元组的集合。因此,关系型数据库中的表行是关系中的元组。
关于关系的维基百科:
在数学中(更具体地说,在集合论和逻辑中),关系是一种将真值分配给k个个体的组合(k元组)的属性。通常,该属性描述了k元组的组成部分之间可能的联系。对于给定的k元组集,根据属性是否成立为每个k元组分配一个真值。

Jason,vartec说的是相反的: 关系数据库中的表行是关系中的元组。 - John Saunders
他也说过“表是关系(在数学意义上)”。也许我应该说“表不是关系”。 :-) - Jason Baker

3
无论在数学中其用途如何,RDBMS中的元组通常被视为表格或结果集中的一行。在RDBMS中,元组是无序的。MDDBMS中的元组是带有其关联维度实例(成员)的单元格中的数据实例。
列族数据存储中的元组是什么?

2

元组 = 1 条记录;n-元组 = 'n' 条记录的有序列表;Elmasri Navathe 书(第三版第198页)。

记录可以是有序或无序的。


0
据我理解,一个表格具有一组键K和一个定义域为K的类型函数T。表格的一行或“元组”是一个函数r,其定义域为K,使得对于每个键k,r(k)是T(k)的一个元素。因此,术语可能会误导人,因为“元组”实际上更像是一个关联数组。

-1
元组是已知的值,用于关联关系型数据库中的表。

-1

从数据库表中获取行数据


它是数据库表中的一行还是任何集合中的任何一行?如果您从多个表、视图等创建投影,那么每一行也是一个元组吗? - flipdoubt
2
一个元组可以是行的子集。 - Tom Carter
2
据我所知,结果集中的一行数据可以来自一个表、多个表、视图等,包含所有字段信息。 - Russ Cam
1
@Tom Carter - 一行可能也是另一行的子集。 :-) - Jason Baker

-1

元组用于指代关系型数据库模型中的一行数据,但是元组与行有一些微小的差别。


-2

元组用于定义立方体中的数据切片;它由一个或多个维度中的一个成员的有序集合组成。元组用于标识立方体中多维数据的特定部分;由立方体中每个维度的一个成员组成的元组完全描述了单元格的值。


在关系模型中,元组是无序的:http://en.wikipedia.org/wiki/Tuple#Relational_model - Jason Baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接