我是Join的新手,无法理解内部联接,自然联接和等联接背后的数学运算之间的区别。总是使用谓词将笛卡尔积乘以较小的结果吗?
有人可以举例说明这三个连接的基础工作吗?
答案 0 :(得分:2)
A和B的内部联接基于联接谓词组合A的行和B的行。例如,“ sempai”联接:SELECT ... FROM people A INNER JOIN people B ON A.age > B.age
将每个人与他们初中的每个人配对;因为没有匹配的行,所以不会从A选出最下级的人,也不会从B选出最高级的人。
Equi join是一种特殊的联接,其中联接关系是相等的。最后一段中的“ sempai”联接不是等价联接;但是“同龄”加入。尽管通常将其用于外部关系(主键上的等号联接),例如SELECT ... FROM person A INNER JOIN bicycle B ON A.bicycle_id = B.id
。 (不要注意这不是一个合适的模型,人们有时会骑多辆自行车……这是一个愚蠢的例子,我敢肯定我会找到更好的一辆。)
自然连接是一种特殊的等值连接,它假定所有共享列均相等(没有明确说明谓词)。例如,假设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 /自然联接不一定必须是内部联接。