关系代数中“theta join”的清晰解释?

时间:2011-09-27 01:58:46

标签: sql relational-database cartesian-product relational-algebra

我正在寻找对关系代数中theta连接概念的清晰,基本的解释,也许是一个例子(或许使用SQL)来说明它的用法。

如果我理解正确,那么theta join是一个添加了条件的自然连接。那么,自然连接强制同名属性之间的相等(并删除副本?),theta join也是如此但事情却增添了条件。我有这个权利吗?任何明确的解释,简单来说(对于非数学家)将不胜感激。

另外(对不起,最后只是把它扔进去,但它有点相关),有人可以解释笛卡尔积的重要性或想法吗?我认为我遗漏了一些关于基本概念的东西,因为对我来说它似乎只是一个基本事实的重述,即一组13 X一组4 = 52 ......

4 个答案:

答案 0 :(得分:12)

暂时搁置SQL ......

关系运算符将一个或多个关系作为参数并产生关系。由于关系没有按定义重复名称的属性,因此关系操作theta join和自然连接都将“删除重复的属性”。 [在SQL中发布用于解释关系操作的示例的一个大问题是,SQL请求的结果不是关系,因为在其他错误中,它可能具有重复的行和/或列。]

关系笛卡尔乘积运算(得到关系)与集笛卡尔乘积不同(得到一组对)。 “笛卡尔”这个词在这里并不是特别有用。事实上,Codd称他的原始运营商为“产品”。

真正的关系语言Tutorial 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

返回关系的乘积,即两度(即两个属性,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 join运算符。这主要是因为其他运算符(例如自然连接和限制)使得它既不必要又不是非常有用。相比之下,Codd的原始运算符包括可用于执行theta连接的产品和限制。


SQL有一个名为CROSS JOIN的显式产品运算符,它强制将结果作为产品,即使它需要通过创建重复的列(属性)来违反1NF。考虑上面的后者Tutoral D exmaple的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只有一个)。

答案 1 :(得分:3)

你不是很正确 - 一个theta连接是一个连接,可能包含一个条件其他而不是= - 在SQL中,通常是<或{{1}等。请参阅TechNet

对于笛卡尔积(或>=),它是一种操作而不是一种想法或概念。这很重要,因为有时你需要使用它! CROSS JOIN和笛卡尔积基于这一事实是一个基本事实。

答案 2 :(得分:2)

在我看来,为了简单起见,如果你了解equijoin,你应该理解theta join。如果将equijoin中的symbol =(equal)更改为&gt; =,那么您已经完成了theta join。但是,我认为与equijoin相比,很难看到使用theta join的实用性,因为我们通常使用的连接原因是V.primarykey = C.foreignkey。如果你想改成theta join,那么它可能取决于你正在做的选择。

对于自然Join,它与equijoin类似,区别在于摆脱冗余属性。易:!)

希望这个解释有所帮助。

答案 3 :(得分:0)

从概念上讲,所有联接均以叉积开始,然后清除某些行。自然联接会清除所有行,其中被联接的两个表中具有相同名称的列具有不同的值。等值连接会清除指定列具有不同值的所有行。并且theta-join会淘汰所有不在指定列中处于指定关系中的行(<,>或其他;原则上,它可能是is_prefix_of作为字符串之间的关系)。