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

Lux*_*ode 11 sql relational-algebra cartesian-product relational-database

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

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

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

one*_*hen 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
Run Code Online (Sandbox Code Playgroud)

返回关系的乘积,即2的次数(即两个属性,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
Run Code Online (Sandbox Code Playgroud)

返回关系的自然连接,即一个程度(即产生一个属性的属性的集合并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;
Run Code Online (Sandbox Code Playgroud)

这将返回一个表表达式,其中包含两列(而不是一个属性),它们都被称为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);
Run Code Online (Sandbox Code Playgroud)

**也就是说,虽然只有一个关系模型(即Codd),但可能存在多个关系代数(即Codd只有一个).