查询
之间有什么区别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
答案 0 :(得分:14)
语法上存在细微差别,但两个查询都在相应表的P_Id
字段上进行连接。
在第二个示例中,这是一个隐式加入,您将WHERE
子句约束到两个表的P_Id
字段。
第一个示例中的连接是显式的,join子句包含约束而不是另外的WHERE
子句。
答案 1 :(得分:3)
它们基本相同。通常,JOIN
关键字可让您更明确地了解方向(LEFT
,RIGHT
)并输入(INNER
,OUTER
,{{1} })你的加入。
答案 2 :(得分:3)
This SO posting对ANSI SQL抱怨的差异有一个很好的解释,并且与这里提出的问题有相似之处。
虽然(如上所述)两个查询都会产生相同的结果,但我发现明确说明你的JOIN总是一个好主意。它更容易理解,尤其是在WHERE子句中存在非JOIN相关的评估时。
明确说明您的JOIN也会阻止您无意中查询笛卡尔积。在上面的第二个查询中,如果您(由于某种原因)忘记包含WHERE子句,则查询将在没有JOIN条件的情况下运行,并返回与Orders中每行匹配的Persons中每行的结果集...可能不是你想要的。
答案 3 :(得分:1)
区别在于语法,但语义中的不是。
显式JOIN
语法:
INNER
,LEFT/RIGHT OUTER
还是CROSS
加入。这与使用特定于DBMS的语法形成对比,例如,旧的Oracle用于左外连接的Persons.P_Id = Orders.P_Id(+)
语法。