内连接、自然连接和等值连接
Posted
技术标签:
【中文标题】内连接、自然连接和等值连接【英文标题】:Inner Join, Natural Joins and Equi Join 【发布时间】:2018-11-30 07:50:43 【问题描述】:我是 Joins 的新手,无法理解内部连接、自然连接和等值连接背后的数学工作之间的区别。它总是使用谓词制成更小的结果的笛卡尔积吗?
有人可以通过示例详细说明这三个连接的基本工作原理吗?
【问题讨论】:
What is the difference between "INNER JOIN" and "OUTER JOIN"? 的可能重复项查看此问题中的所有答案,您会找到所需的内容 @SudiptaMondal 这是一个完全不同的问题。 @Amadan - 这个问题的很多答案都有关于维恩图的解释 确实如此。解释内部和外部之间的差异。不是内在的、自然的和平等的。我搜索了整个问题,提到了 equi 连接,但只定义了一次,不正确。 @Amadan 哦,是的,它没有用于自然连接,它只有用于内部和 equi 【参考方案1】:A 和 B 的内连接基于连接谓词组合来自 A 的行和来自 B 的行的列。例如,“sempai”加入:SELECT ... FROM people A INNER JOIN people B ON A.age > B.age
会将每个人与每个他们的初级成员配对;不会从 A 中选择最年轻的人,也不会从 B 中选择最年长的人,因为没有匹配的行。
Equi 连接是一种特殊的连接,其中连接关系是相等的。最后一段中的“sempai”连接不是等连接;但“同龄”加入会。虽然通常它会用于外部关系(主键上的等连接),例如SELECT ... FROM person A INNER JOIN bicycle B ON A.bicycle_id = B.id
。 (不要注意这不是一个合适的模型,人们有时会有多辆自行车......有点愚蠢的例子,我相信我可以找到更好的。)
自然连接是一种特殊的 equi 连接,它假定所有共享列相等(没有明确说明谓词)。例如SELECT ... FROM people A INNER JOIN bicycles B ON A.bicycle_id = B.bicycle_id
等价于SELECT ... FROM people A NATURAL JOIN bicycles B
,假设bicycle_id
是两个表中唯一存在的列。我认识的大多数人不会使用它,原因有几个 - 让主键不重复表名是更常见的做法,即bicycles.id
而不是bicycles.bicycles_id
;外键可能不反映表名(例如 person.overseer_id
而不是 person.person_id
,原因很明显),并且(忘记了我,但幸好被 Sudipta Mondal 记住)可能有不相关的列名称相同但是加入是零意义的,比如creation_time
。由于这些原因,我一生中从未使用过NATURAL JOIN
。
Equi/natural 连接不一定必须是内部的。
【讨论】:
以上是关于内连接、自然连接和等值连接的主要内容,如果未能解决你的问题,请参考以下文章
mysql数据库——连接查询(内连接:自然连接,等值连接。外连接:左连接,右连接,全连接)