自然连接的维恩图

时间:2019-04-11 19:12:53

标签: sql database join venn-diagram natural-join

我一直在试图完全理解sql join的概念,维恩图对我的帮助很大。我发现它们适用于所有类型的联接,但不适用于自然联接。

用于自然连接的维恩图看起来如何?

1 个答案:

答案 0 :(得分:3)

Venn图对于理解自然联接或内部联接不是很有帮助。与Stack Overflow上的联接相关联的大多数Venn图都是鹦鹉毫无意义的虚假陈述,即使在Venn图可能有用的情况下。

以下是Venn图对于SQL自然连接的一些有效用法:

如果忽略列顺序,我们可以使一个区域成为一个集合,其元素是关联表的列名。然后,左右圆圈的元素是左右表格的列名,合并的元素是结果的列名。

如果具有相同名称的输入表列具有相同的类型,则我们可以设置一个区域,该区域的元素是出现在公共列表中某处的子行值。那么左右圆圈的元素就是左右表格的子行值,而交集元素就是结果的子行值。

但是图和对都不告诉我们输出行是什么。

根据我在CROSS JOIN vs INNER JOIN in SQL Server 2008的回答:

  

维恩图具有两个相交圆的维恩图可以说明同一输入的INNER,LEFT,RIGHT和FULL JOIN的输出行之间的差异。当ON无条件为TRUE时,INNER JOIN结果与CROSS JOIN相同。它还可以说明INTERSECT,UNION和EXCEPT的输入和输出行。当两个输入的列相同时,INTERSECT的结果与标准SQL NATURAL JOIN的结果相同,而EXCEPT的结果与涉及LEFT&RIGHT JOIN的某些惯用法相同。但这并没有说明(INNER)JOIN的总体工作原理。乍一看似乎很合理。它可以为ON,PK(主键),FK(外键)和/或SELECT的特殊情况识别输入和/或输出的部分。您要做的就是识别由圆圈表示的集合中的元素到底是什么。 (请记住,那些混乱的演示文稿永远不会弄清楚。)(请记住,对于联接,输出行的标题与输入行的标题不同。)

我重点强调:

  

但是它并没有说明(INNER)JOIN的一般工作方式。

  

要做的只是识别由圆圈表示的集合中的元素是什么

my comments on an answer中,针对交叉连接(我错误地称其为维恩)重新添加了其增强的Euler图“图2”,对于内部连接(使用“键”,在“图例”)

  

图2的键很复杂:它用CROSS JOIN的自变量包围(与颜色无关)元素,而数字(与值无关)是它的一行,而一行(与颜色无关)是结果行。对于作为袋子的表,它不是维恩图(emn);对于作为值的行,这是错误的;对于作为元素的行,它们不能共享。对于作为集合的表,您不需要维恩图。图1是解释JOIN的常见可怕的尝试。它的密钥也很复杂:仅用于表为集合,仅用于等值联接,并且仅用于一个[列];它也代表输入而不是输出。通常为JOIN编写 it [的图例]。

摘自我对What is the difference between “INNER JOIN” and “OUTER JOIN”?的评论:

  

Venn图显示集合中的元素。只需尝试准确地确定这些图中的集合和元素是什么。集合表示表,元素表示其行。另外,任何两个表都可以连接,因此PK和FK无关紧要。所有伪造。您正在做其他成千上万的工作-误以为是含糊的印象 假设是有意义的。

  

only one下面的答案和评论及其参考文献实际上解释了维恩图如何表示算子:圆交集区域表示A JOIN B中的行集。每个圆圈唯一的区域表示通过获取不参与A JOIN B的表中的行并添加其他表唯一的列(都设置为NULL)来获得行。 (而且大多数人将圆圈与A和B的模糊虚假对应关系。)

因此,维恩图与某些情况相关,在某些情况下,可以合理地认为表包含行值元素的集合。 但是在一般情况下,SQL表不包含行值元素集,而维恩图表示集。

通过维恩图重新说明内部联接和外部联接:

来自my comment on LEFT JOIN vs. LEFT OUTER JOIN in SQL Server

  

关于维恩图:如果没有输入空值或重复的行,那么我们可以将一个表作为一组行值并使用正常的数学=,那么维恩图就可以了-保留左右联接输出表/集。但是,如果输入的是空值或重复的行,那么很难解释圆是什么集合以及这些集合与输入和输出表/包的关系如何,以至于维恩图无济于事。

来自my comment on my answer at What is the difference between “INNER JOIN” and “OUTER JOIN”?

  

我必须承认,尽管我的措辞很快,但是因为SQL涉及到包和空值,并且SQL文化没有通用的术语来命名和区分相关概念,所以即使清楚地解释了SQL元素的原理也很简单。维恩图是1:1的,输出为“行”,更不用说输入“行”了。或内部或外部联接的作用,更不用说它们之间的区别了。 “值”可能包含或可能不包含NULL,“行”可能是值列表与表值中的插槽或变量&“ =”可能是SQL“ =” vs等于。

PS当图实际上是Venn diagrams时,它们通常称为Euler diagrams