什么是关系代数中的 theta join 并举例说明(也许使用 SQL)?
theta join 是带条件的自然连接吗?因此,自然连接强制同名属性之间相等(并删除重复项?),而 theta 连接则执行相同的操作,但添加了一个条件?
笛卡尔积的重要性或想法是什么?
这就像重述一个基本事实,例如一组 13 X 一组 4 = 52。
暂时将 SQL 放在一边......
关系运算符将一个或多个关系作为参数并产生一个关系。由于关系根据定义不具有重复名称的属性,因此关系操作 θ 连接和自然连接都将“删除重复的属性”。 [按照您的要求,在 SQL 中发布示例来解释关系操作的一个大问题是,SQL 查询的结果不是关系,因为除其他问题外,它可能具有重复的行和/或列。]
关系笛卡尔积运算(关系中的结果)不同于集合笛卡尔积(一组对的结果)。 “笛卡尔”这个词在这里并不是特别有用。事实上,科德称他的原始运算符为“产品”。
真正的关系语言教程 D 缺少乘积运算符,并且乘积并不是教程 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
返回关系的自然连接,即度为 1(即产生一个属性的属性的集合并
Y
)和基数为 2(即删除重复元组)。
我希望上面的例子能够解释为什么你的说法“一组 13 X 一组 4 = 52”并不严格正确。
同样,教程 D 不包含 theta 连接运算符。这本质上是因为其他运算符(例如自然连接和限制)使其既不必要又不是很有用。相比之下,Codd 的原始运算符包括乘积和限制,可用于执行 theta 连接。
SQL 有一个名为
CROSS JOIN
的显式乘积运算符,它强制结果为乘积,即使它需要通过创建重复列(属性)来违反 1NF。考虑与上面后面的教程 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 行,即 this
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 模型),但可以有多个关系代数(即 Codd 模型只有一个)。
你不太正确 - theta 连接是一种连接,可能包含除 =
以外的条件
other- 在 SQL 中,通常是
<
或 >=
等。请参阅 TechNet
对于笛卡尔积(或
CROSS JOIN
),它是一种运算,而不是一种想法或概念。这很重要,因为有时您需要使用它! set of 13 x set of 4 = 52
是一个基本事实,笛卡尔积就是基于这个事实。
在我看来,为了简单起见,如果你理解等值连接,你应该理解 theta 连接。如果将等值连接中的符号 =(等于)更改为 >=,那么您就已经完成了 theta 连接。然而,我认为与等值连接相比,很难看出使用 theta 连接的实用性,因为我们通常使用的连接原因是 V.primarykey = C.foreignkey。如果您想更改为 theta join,那么它可能取决于值,因此您正在进行选择。
对于自然连接,它与等值连接类似,区别只是去掉了多余的属性。简单!:)
希望这个解释有帮助。
所有联接都可以被认为是从叉积开始,然后清除某些行。自然连接会清除被连接的两个表中同名列具有不同值的所有行。等值连接会清除指定列具有不同值的所有行。并且 theta-join 会清除指定列不属于指定关系的所有行(<, >,或者其他;原则上它可以是 is_prefix_of 作为字符串之间的关系)。
更新:请注意,外连接不能这样理解,因为它们无中生有地合成信息(即空值)。