【问题标题】:How is a natural join different from a JOIN ON clause?自然连接与 JOIN ON 子句有何不同?
【发布时间】:2025-12-27 00:05:06
【问题描述】:

因此,对于我的教授分配的一个有趣的小实验室,他希望我们使用不同的连接操作创建自己的查询。我比较好奇的是 NATURAL JOIN 和 JOIN ON。

自然连接的教科书定义 - “返回匹配列中具有匹配值的所有行并消除重复列。”所以,假设我有两个表,客户和订单。我列出了客户提交的所有 id = 1 的订单,如下所示:

Select Customers.Name
From Customers, Orders
Where Customers.ID = 1
AND Customers.ID = Orders.CID

我想知道这与 JOIN ON 有何不同,根据教科书“返回满足指定连接条件的行,通常包括两个表示列的相等比较”,即一个表的主键和一个另一个的外键。所以 JOIN ON 子句本质上与自然连接做同样的事情。它根据ON子句中指定的参数返回所有匹配值的行。

Select Customers.Name
From Customers JOIN Orders ON Customers.ID = Orders.CID

同样的结果。后者只是编写自然连接的一种更简单的方法,还是我在这里遗漏了什么?

有点像 JavaScript 中的方式,我可以说:

var array = new Array(1, 2, 3);

或者我可以只使用更快更简单的文字,而无需构造函数:

var array = [1, 2, 3];

编辑:甚至没有意识到自然连接在 FROM 子句中使用了 JOIN 关键字,并省略了 WHERE 子句。这只是表明我对这种语言知之甚少。为了跟踪我自己的进度,我会保留错误。

【问题讨论】:

标签: sql join natural-join


【解决方案1】:

自然加入是:

总是等值连接
始终通过所有同名属性的相等性匹配

本质上归结为根本无法指定 JOIN 条件。所以你只能指定 T1 NATURAL JOIN T2 就可以了,SQL 会从中推导出整个匹配条件。

加入是:

并不总是等 JOIN(您也可以指定 JOIN ON T1.A > T2.A)
并不总是涉及按名称对应的所有属性(如果两个表都有一个名为 A 的属性,您仍然可以省略 ON T1.A = T2.A)。

您的 ID/CID 示例不适合直接使用 NATURAL JOIN。您必须通过声明 [类似内容] 来重命名属性以获得所需的列/属性匹配:

SELECT Customers.Name From Customers NATURAL JOIN (SELECT CID as ID FROM Orders)

(正如您自己在问题中所说的那样,有关于重复删除的问题,其他形式的 JOIN 本身没有这样做。这是一个严格遵守关系理论的问题,而 SQL 作为一个整体却没有。说得客气一点,就是不擅长。)

【讨论】:

  • Customers.Name 中的范围变量Customers 是多余的,您可能需要SELECT DISTINCT,因为NATURAL JOIN 无法删除重复的 :)
  • 哎哟。似乎我错过了在 SQL 自然连接的特定上下文中“重复删除”的确切含义。可能应该坚持我最初的计划,以参考“SQL 比较调查”来了解所有/大部分细节。我从来没有遇到过你提到的 JOIN ON 表格。你大概是对的。
  • 我的错!我的意思是,JOIN USING ( <attribute list> ) 也会显示重复属性删除。