SQL JOIN和从两个表中查询的区别

17

查询中的这两个语句有什么区别?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

还有这一个

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

如果没有where子句,我可以假设select返回一个交叉连接吗? - Ahmed Ziyad
4个回答

18

语法上有一点小差异,但两个查询都在各自表的 P_Id 字段上进行连接。

在您的第二个示例中,这是一个隐式连接,您在 WHERE 子句中对两个表的 P_Id 字段进行约束。

在您的第一个示例中,连接是显式的,连接子句包含了约束条件,而不是在附加的 WHERE 子句中。


3

它们基本等价。通常,JOIN 关键字使您可以更明确地指定连接的方向(LEFTRIGHT)和类型(INNEROUTERCROSS)。


3

这个Stack Overflow帖子很好地解释了ANSI SQL合规性的差异,并与在此提出的问题相似。

尽管(如已经说明的那样)两个查询将产生相同的结果,但我认为明确声明JOIN总是一个好主意。这更容易理解,特别是当WHERE子句中存在非JOIN相关评估时。

明确声明JOIN还可以防止您无意中查询笛卡尔积。在上面的第二个查询中,如果您(出于任何原因)忘记包含WHERE子句,则查询将在没有JOIN条件的情况下运行,并返回Persons中的每一行与Orders中的每一行匹配的结果集...可能不是您想要的。


2

区别在于语法,但不在语义上。

显式的JOIN语法:

  • 被认为更易读,并且
  • 允许您以清晰和标准的方式指定您想要的INNERLEFT/RIGHT/FULL OUTERCROSS连接。这与使用特定于DBMS的语法形成对比,例如旧版Oracle的Persons.P_Id = Orders.P_Id(+)语法用于左外连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接