因此,对于我教授指定的一个有趣的小实验室,他希望我们使用不同的连接操作创建自己的查询。我很好奇的是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根据教科书"返回符合指定连接条件的行,并且通常包括两个表达列的相等比较"即一个表的主键和另一个表的外键。因此,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子句。这只是表明我对这种语言知之甚少。为了跟踪自己的进度,我会保留错误。
答案 0 :(得分:3)
NATURAL JOIN是:
总是一个等于加入 始终匹配所有相同名称的属性的相等性
实质上归结为根本没有办法指定JOIN条件。所以你只能指定T1 NATURAL JOIN T2,那就是SQL,SQL将从中得到整个匹配条件。
加入是:
并非始终是equi-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是温和地说,整体并不擅长。)