当前位置: 首页 > 面试题库 >

关系代数中“ heta联接”的清晰解释?

裴俊迈
2023-03-14
问题内容

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

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

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


问题答案:

将SQL搁置一会儿…

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

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

真正的关系语言Tutorial
D
在Tutorial
D的合著者Hugh Darwen
**提出的关系代数中缺少乘积运算符,而product不是原始运算符。这是因为没有属性名称的两个关系的自然连接在相同的关系中产生的结果与相同的两个关系的乘积相同,即自然连接更普遍,因此更有用。

考虑以下示例(教程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只是一个)。



 类似资料:
  • 我已经编写了下面的PostgreSQL查询,它可以正常工作。然而,它似乎非常慢,有时需要10秒才能返回结果。我确信我的声明中有某种东西导致这一切进展缓慢。 有人能帮助确定为什么这个查询很慢吗? 我用以下内容替换了: 解释分析结果:

  • 想要的结果: 目前idea支持对调用层次的导出: 问题:如何导出第一张图中的那种效果?

  • 问题内容: 只是一个简单的问题: 如何清除外壳中的屏幕?我见过类似的方式: 这只是打开Windows cmd,清除屏幕并关闭,但是我希望清除外壳窗口 (PS:我不知道这有帮助,但是我使用的是Python 3.3.2版) 谢谢:) 问题答案: 对于macOS / OS X,您可以使用子进程模块并从外壳程序中调用“ cls”: 为了防止在窗口顶部显示“ 0”,请用以下内容替换第二行: 对于Linux,

  • 这就是我现在对关联、聚合和组合的理解。 协会 聚集 构成 我认为理解这些词的意思是没有意义的,除非我不能在实际代码中表示它。以上代码取自SO答案(如果以上代码错误,请告诉我)。 我的问题是闪烁。 1) 在类图中显示聚合和组合是否重要 2) 我使用了一个可以转换java的工具。将文件分类到类图中。类可视化工具,但我无法使此工具在类图中显示聚合或组合关系。这是工具的问题还是我不了解如何在代码中使用组合

  • 问题内容: 我正在学习spark,但是我不明白此功能。 输出为: 首先,我很困惑:第二步在哪里?我从结果中找不到。 其次,我阅读了的功能说明,但对算法流程感到困惑。 问题答案: 该调用不会尝试合并/合并值,因此这是一项昂贵的操作。 因此,调用就是这样的优化。当使用值在每个分区上合并为一个值时,则每个分区值将合并为单个值。值得注意的是,合并值的类型不必与原始值的类型匹配,并且通常不需要。该函数以3个

  • 本文向大家介绍python中yield的用法详解——最简单,最清晰的解释,包括了python中yield的用法详解——最简单,最清晰的解释的使用技巧和注意事项,需要的朋友参考一下 首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考