这里的大多数答案都在正确的轨道上。然而,一个row 不是元组. Tuples*
are 无序的带名称的已知值集。因此,以下元组是相同的东西(我使用虚构的元组语法,因为关系元组很大程度上是一个理论构造):
(x=1, y=2, z=3)
(z=3, y=2, x=1)
(y=2, z=3, x=1)
...当然假设 x、y 和 z 都是整数。另请注意,不存在“重复”元组之类的东西。因此,以上不仅相等,而且一样。最后,元组只能包含已知值(因此不能包含空值)。
A row**
是带有名称的已知或未知值的有序集合(尽管它们可以被省略)。因此,以下比较在 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)
Or this:
INSERT INTO point (y, z, x) VALUES (2, 3, 1)
...但我们真正要做的只是改变顺序而不是删除它。
另请注意,也可能存在未知值。因此,您可能会有具有未知值的行:
(1, 2, NULL) = (1, 2, NULL)
...但请注意,这种比较总是会产生UNKNOWN
。毕竟,您如何知道两个未知值是否相等?
最后,行可能会重复。换句话说,(1, 2)
and (1, 2)
比较起来可能是相等的,但这并不一定意味着它们是同一件事。
如果这是您感兴趣的主题,我强烈建议您阅读SQL 和关系理论:如何编写准确的 SQL 代码 https://rads.stackoverflow.com/amzn/click/com/0596523068由 CJ 日期。
*
请注意,我谈论的是关系模型中存在的元组,这与一般数学有点不同。
**
以防万一您想知道,SQL 中的所有内容都是行或表。所以,(1, 2)
是一行,而VALUES (1, 2)
是一张表(一行)。
UPDATE:我在博客文章中对此答案进行了一些扩展here http://jasonmbaker.wordpress.com/2009/07/05/the-relational-model-of-tuples-relations-rows-and-tables/.