自然连接的维恩图

Iri*_*bbs 3 sql database join natural-join venn-diagram

我一直在尝试完全理解 sql 连接的概念,维恩图在这方面帮助了我很多。我发现它们适用于所有类型的连接,但不适用于自然连接。

自然连接的维恩图是什么样子的?

phi*_*pxy 5

维恩图对于理解自然连接或内连接没有太大帮助。大多数与 Stack Overflow 和网络上的联接相关的维恩图都是人云亦云的毫无价值的虚假陈述——即使在维恩图可能有用的情况下也是如此。

以下是 SQL 自然连接维恩图的一些有效用法:

我们可以将一个区域作为一个集合,其元素是关联表的列名。那么左右圆圈元素是左表和右表列名,重叠元素是公共列名(在每个输入表中必须出现一次),组合元素是结果的列名。但是 SQL 表可以有重复的列名,并且列是有序的;所以这不会给出结果列列表。

我们可以将一个区域作为一个集合,其元素是公共列下的不同子行值。那么左右圆元素就是左右表子行值,重叠元素就是结果子行值。但这并没有给出子行值在表中出现的次数。特别是,当所有列都是通用的,因此子行值是行值时,这不会给出行值在结果中出现的次数。

图和对都没有给出输出行的一般情况。

根据在 SQL 中的 CROSS JOIN vs INNER JOIN的回答:

Re 维恩图具有两个相交圆的维恩图可以说明同一输入的 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 一般是如何工作的。

要看到这一点,您所要做的就是确定圆圈所代表的集合的元素到底是什么

根据我对答案的评论之一,有其内部连接的维恩图:

图 1 是解释 JOIN 的常见的糟糕尝试。它的[图例]也很复杂:它仅适用于作为集合的表&仅等值连接&仅一个[列];它还表示输入与输出不同。一般写为JOIN 。

来自我对“INNER JOIN”和“OUTER JOIN”之间有什么区别? 的评论之一 :

维恩图显示集合中的元素。只需尝试准确识别这些图中的集合是什么以及元素是什么。集合不是表,元素也不是行。另外,任意两个表都可以连接,因此 PK 和 FK 是无关的。都是假的。你正在做的正是成千上万其他人所做的事情——有一个模糊的印象,你(错误地)认为这是有道理的。

还有另一个

在下面的答案和评论及其参考文献中,只有一个实际上解释了维恩图如何表示运算符:圆圈交叉区域表示 A JOIN B 中的行集。每个圆圈唯一的区域表示通过取其值得到的行集表中不参与 A JOIN B 的行并添加另一个表特有的列,全部设置为 NULL。(大多数人给出了圆圈与 A 和 B 的模糊虚假对应关系。)

因此,维恩图与某些情况相关,在这些情况下,表可以合理地被视为保存行值元素集但一般来说,SQL 表不保存行值元素的集合,而维恩图表示集合。

通过维恩图重新说明内部连接与外部连接:

根据我对 SQL Server 中的 LEFT JOIN 与 LEFT OUTER JOIN的评论:

Re Venn 图:如果没有输入空值或重复行,那么我们可以将表视为一组行值并使用正常数学 =,那么 Venn 图就可以了 -用圆圈来保存左连接和右连接输出表/集。但是,如果输入空值或重复行,则很难解释圆圈是什么集合以及这些集合如何与输入和输出表/包相关,维恩图没有帮助。

我对INNER JOIN”和“OUTER JOIN”之间有什么区别?:

我必须承认,尽管我在评论中措辞很快,但由于 SQL 涉及 bag 和 null,并且 SQL 文化没有通用术语来命名和区分相关概念,因此即使清楚地解释维恩图的元素如何工作也并非易事。输出“行”是 1:1,更不用说输入“行”了。或者内连接或外连接做什么,更不用说它们的区别了。“value”可以包含也可以不包含 NULL,“row”可以是值列表与表值或变量中的槽,“=”可以是 SQL“=”与相等。

PS 通常,当图实际上是欧拉图时,它们被称为维恩图