暂时将 SQL 放在一边……
关系运算符将一个或多个关系作为参数并产生一个关系。因为根据定义,关系没有具有重复名称的属性,所以关系操作 theta join 和 natural join 都将“删除重复的属性”。[按照您的要求,在 SQL 中发布示例来解释关系操作的一个大问题是,SQL 查询的结果不是关系,因为除其他问题外,它可能有重复的行和/或列。]
关系笛卡尔积运算(产生关系)不同于集合笛卡尔积(产生一组对)。“笛卡尔”这个词在这里并不是特别有用。事实上,Codd 称他的原始算子为“产品”。
真正的关系语言Tutorial D缺少乘积运算符,并且 product 不是 Tutorial D 的合著者Hugh Darwen ** 提出的关系代数中的原始运算符。这是因为没有共同属性名称的两个关系的自然连接导致相同的关系作为相同两个关系的乘积,即自然连接更一般,因此更有用。
考虑这些示例(教程 D):
WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
RELATION { TUPLE { X 1 } , TUPLE { X 2 } } AS R2 :
R1 JOIN R2
返回关系的乘积,即二的度数(即两个属性X
和Y
)和 6 的基数(2 x 3 = 6 个元组)。
然而,
WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } } AS R2 :
R1 JOIN R2
返回关系的自然连接,即度数为一(即产生一个属性的属性的集合并集Y
)和基数为 2(即删除重复的元组)。
我希望上面的例子能解释为什么你的陈述“一组 13 X 一组 4 = 52”并不完全正确。
同样,教程 D 不包括 theta 连接运算符。这本质上是因为其他运算符(例如自然连接和限制)使其既不必要又不是非常有用。相比之下,Codd 的原始运算符包括可用于执行 theta 连接的产品和限制。
SQL 有一个明确的乘积运算符CROSS JOIN
,它强制结果为乘积,即使它通过创建重复列(属性)而违反 1NF。考虑与上面后面的 Tutoral D 示例等效的 SQL:
WITH R1 AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (Y)),
R2 AS (SELECT * FROM (VALUES (1), (2)) AS T (Y))
SELECT *
FROM R1 CROSS JOIN R2;
这将返回一个表表达式,其中包含两列(而不是一个属性),都称为Y
(!!) 和 6 行,即这个
SELECT c1 AS Y, c2 AS Y
FROM (VALUES (1, 1),
(2, 1),
(3, 1),
(1, 2),
(2, 2),
(3, 2)
) AS T (c1, c2);
** 也就是说,虽然只有一个关系模型(即 Codd's),但关系代数可能不止一个(即 Codd's 只是一个)。