自然连接的维恩图
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。
【讨论】:
以上是关于自然连接的维恩图的主要内容,如果未能解决你的问题,请参考以下文章