自然连接的维恩图

Posted

技术标签:

【中文标题】自然连接的维恩图【英文标题】:Venn Diagram for Natural Join 【发布时间】:2019-09-02 12:16:17 【问题描述】:

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

是什么样的?

【问题讨论】:

自然连接是 INNER JOIN 的语法糖,仅此而已 @LukaszSzozda 完美地说:“语法糖”。我喜欢它。你介意我重复一遍吗? 将自然连接视为内部连接会让新手感到困惑。还谈论外部连接(@GordonL)是错误的。内连接和外连接都在结果中包含来自两个操作数的所有列(即SELECT *)。 Nat Join 不会重复操作数中的同名列。我同意维恩图对于这个目的是可憎的。 @TheImpaler “语法糖”是 Landin 经典的“未来 500 种编程语言”中创造的一个常用术语,对编程语言感兴趣的每个人都应该阅读。 @LukaszSzozda 自然连接是 INNER JOIN USING 的语法糖,但这并不能说明什么,因为 INNER JOIN 是由一堆更简单的概念拼凑而成的,包括 INNER JOIN USING、CROSS JOIN 和 WHERE ,而“仅此而已”只是表明您不知道the point of NATURAL JOIN--simplicity。当关系表 R & S 保存满足谓词 r & s 的行时,R NATURAL JOIN S 保存满足 r AND s 的行,对于 UNION & OR、EXCEPT/MINUS & AND NOT、WHERE/RESTRICT & AND 和 SELECT/PROJECT & EXISTS 类似. 【参考方案1】:

维恩图对于理解自然连接或内连接不是很有帮助。大多数与 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。

【讨论】:

以上是关于自然连接的维恩图的主要内容,如果未能解决你的问题,请参考以下文章

sql连接为维恩图

SQL中的自然连接是啥意思啊?

内连接、自然连接和等值连接

theta 连接、等值连接和自然连接之间的区别

自然连接和内连接的区别

自然连接和内连接有啥区别?