gpt4 book ai didi

sql - 关系代数中 "theta join"的清晰解释?

转载 作者:行者123 更新时间:2023-12-04 01:52:32 28 4
gpt4 key购买 nike

我正在寻找有关关系代数中theta join概念的清晰,基本的解释,并且可能需要一个示例(也许使用SQL)来说明其用法。

如果我正确理解,则theta联接是添加了条件的自然联接。因此,尽管自然联接在相同名称的属性之间强制相等(并删除重复的属性?),但是theta联接执行相同的操作,但是增加了在某种情况下。我有这个权利吗?以简单的术语(对于非数学家)的任何清楚的解释将不胜感激。

另外(很抱歉,最后才提出来,但与之相关),有人可以解释笛卡尔积的重要性或想法吗?我认为我在基本概念方面缺少一些东西,因为在我看来,这似乎是对一个基本事实的重申,即一组13 X一组4 = 52 ...

最佳答案

将SQL搁置一会儿...

关系运算符将一个或多个关系作为参数并生成一个关系。因为根据定义,关系中没有具有重复名称的属性,所以关系操作theta联接和自然联接都将“除去重复的属性”。 [按照您的要求在SQL中发布示例以解释关系操作的一个大问题是,SQL查询的结果不是关系,因为除其他缺点外,它可能具有重复的行和/或列。]

关系笛卡尔积运算(一个关系的结果)与设置的笛卡尔积(一对结果的结果)不同。 “笛卡尔”一词在这里并不是特别有用。实际上,科德称他的原始运算符为“产品”。

在教程D的合著者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

返回关系乘积的乘积,即两个关系的度数(即两个属性 XY)和基数为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,该运算符也将结果强制为乘积。考虑与上面的后者Tutormap 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模型),但是可以有多个关系代数(即Codd只是一个模型)。

关于sql - 关系代数中 "theta join"的清晰解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com