维恩图对于理解自然连接或内连接不是很有帮助。大多数与 Stack Overflow 上的连接相关的维恩图都是徒劳无益的虚假陈述——即使在维恩图可能有用的情况下也是如此。
以下是维恩图在 SQL 自然连接中的一些有效用法:
如果您忽略列顺序,我们可以将区域设置为一个集合,其元素是关联表的列名。那么左右圆的元素就是左右表的列名,组合的元素就是结果的列名。
如果输入表的同名列具有相同的类型,那么我们可以有一个区域是集合,其元素是出现在表中某处的公共列的子行值。那么左右圆的元素就是左右表的子行值,交集的元素就是结果的子行值。
但无论是图表还是这对都不能告诉我们输出行是什么。
来自我在CROSS JOIN vs INNER JOIN in SQL Server 2008的回答:
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 的一般工作原理。
您所要做的就是确定圆圈所代表的集合的元素究竟是什么。
来自my comments (using "key" in the sense of "legend") on an answer 的内部连接维恩图“图 1”:
图 1 是解释 JOIN 的常见可怕尝试。它的关键也很复杂:它只适用于作为集合的表&只有等值连接&只有一个[列];它还表示与输出不同的输入。为 JOIN 写 it。
来自What is the difference between “INNER JOIN” and “OUTER JOIN”?我的cmets:
维恩图以集合的形式显示元素。只需尝试准确地确定这些图表中的集合是什么以及元素是什么。集合不是表格和元素不是它们的行。也可以连接任意两个表,因此 PK 和 FK 无关紧要。所有伪造。你所做的正是成千上万其他人所做的——得到一个模糊的印象你(错误地)认为是有道理的。
only one下面的答案和cmets及其参考实际上解释了维恩图如何表示运算符:圆形交叉区域表示A JOIN B中的行集。每个圆唯一的区域表示您的行集通过获取其表中不参与 A JOIN B 的行并将对另一个表唯一的列全部设置为 NULL 来获取。 (而且大多数人都给 A 和 B 提供了一个模糊的、虚假的圈子对应关系。)
因此,维恩图适用于某些情况可以合理地认为表包含行值元素集。 但一般而言,SQL 表不包含行值元素的集合,而维恩图表示集合。
通过维恩图重新说明内连接和外连接:
来自my comment on LEFT JOIN vs. LEFT OUTER JOIN in SQL Server
Re 维恩图:如果没有输入空值或重复行,那么我们可以将表作为一组行值并使用正常的数学 =,那么维恩图是可以的--画圈保存左右连接输出表/集。但是,如果输入了空值或重复行,那么很难解释这些圆圈是由什么组成的,以及这些集合与输入和输出表/袋的关系如何,以至于维恩图没有帮助。
来自my comment on my answer at What is the difference between “INNER JOIN” and “OUTER JOIN”?
我必须承认,尽管我在 cmets 中快速措辞,但由于 SQL 涉及包和空值,并且 SQL 文化没有通用术语来命名和区分相关概念,即使清楚地解释维恩图是 1:1 的输出“行”,更不用说输入“行”了。或者内部或外部连接的作用,更不用说它们的区别了。 “value”可能包含也可能不包含 NULL,“row”可能是值列表 vs 表值或变量中的一个槽,“=”可能是 SQL “=” vs 相等性。
PS 通常图表被称为Venn diagrams,而实际上它们是Euler diagrams。