SQL JOIN与从两个表查询之间的区别

时间:2012-02-28 13:19:13

标签: mysql sql join

查询

之间有什么区别
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

4 个答案:

答案 0 :(得分:14)

语法上存在细微差别,但两个查询都在相应表的P_Id字段上进行连接。

在第二个示例中,这是一个隐式加入,您将WHERE子句约束到两个表的P_Id字段。

第一个示例中的连接是显式的,join子句包含约束而不是另外的WHERE子句。

答案 1 :(得分:3)

它们基本相同。通常,JOIN关键字可让您更明确地了解方向(LEFTRIGHT)并输入(INNEROUTER,{{1} })你的加入。

答案 2 :(得分:3)

This SO posting对ANSI SQL抱怨的差异有一个很好的解释,并且与这里提出的问题有相似之处。

虽然(如上所述)两个查询都会产生相同的结果,但我发现明确说明你的JOIN总是一个好主意。它更容易理解,尤其是在WHERE子句中存在非JOIN相关的评估时。

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

答案 3 :(得分:1)

区别在于语法,但语义中的不是

显式JOIN语法:

  • 被认为更具可读性
  • 允许您以标准方式干净利落地 指定您是希望INNERLEFT/RIGHT OUTER还是CROSS加入。这与使用特定于DBMS的语法形成对比,例如,旧的Oracle用于左外连接的Persons.P_Id = Orders.P_Id(+)语法。