我一直在尝试完全理解 sql join 的概念,维恩图在这方面帮助了我很多。我发现它们适用于所有类型的连接,但不适用于自然连接。
自然连接的维恩图是什么样子的?
我一直在尝试完全理解 sql join 的概念,维恩图在这方面帮助了我很多。我发现它们适用于所有类型的连接,但不适用于自然连接。
自然连接的维恩图是什么样子的?
维恩图对于理解自然连接或内连接不是很有帮助。大多数与 Stack Overflow 上的连接相关的维恩图都是徒劳无益的虚假陈述——即使在维恩图可能有用的情况下也是如此。
以下是对 SQL 自然连接的维恩图的一些有效用途:
如果您忽略列顺序,我们可以将一个区域设置为一个集合,其元素是关联表的列名。然后左右圆圈的元素是左右表的列名,组合元素是结果的列名。
如果具有相同名称的输入表列具有相同的类型,那么我们可以将一个区域作为集合,其元素是出现在公共列的表中某处的子行值。那么左右圆的元素就是左右表的这样的子行值,交集的元素是结果的这样的子行值。
但是图表和这对都没有告诉我们输出行是什么。
根据我在 SQL Server 2008 中的 CROSS JOIN 与 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、PKs(主键)、FKs(外键)和/或 SELECT 的特殊情况。你所要做的就是确定圆圈所代表的集合的元素到底是什么。(混乱的演示永远不会说清楚。)(请记住,通常对于连接,输出行与输入行有不同的标题。)
我强调一遍:
但它并没有说明 (INNER) JOIN 的一般工作原理。
你所要做的就是确定圆圈所代表的集合的元素到底是什么。
从我的评论(在“传说”的意义上使用“键”)对内部连接的维恩图“图 1”的答案:
图 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 的评论
重新维恩图:如果没有输入空值或重复行,那么我们可以将表作为一组行值并使用正常的数学 =,那么维恩图就可以了——用圆圈来保持左右连接输出表/集。但是,如果输入了空值或重复行,那么很难解释这些圆圈是什么集合以及这些集合与输入和输出表/包的关系如何,以至于维恩图没有帮助。
根据我对“INNER JOIN”和“OUTER JOIN”之间的区别的回答的评论?
我必须承认,尽管我在评论中快速措辞,因为 SQL 涉及包和空值,并且 SQL 文化没有通用术语来命名和区分相关概念,即使清楚地解释维恩图的元素如何与输出“行”是 1:1,更不用说输入“行”了。或者内部或外部联接做什么,更不用说它们的区别了。“value”可能包含也可能不包含 NULL,“row”可能是值列表 vs 表值或变量中的插槽 & “=”可能是 SQL “=” vs 相等性。