SQL JOIN概念

时间:2018-05-16 11:29:56

标签: sql join

最近我对SQL JOIN执行顺序感到困惑。假设我有3个这样的表: image

这是查询:

 SELECT * 
 FROM Table_a a 
 LEFT JOIN Table_b b ON a.id=b.id
 INNER JOIN table_c c ON b.id=c.id

您认为结果如何?根据我在几个网页上看到的内容,订单不会影响结果。

这就是我认为结果将是A左连接B,那么结果将是与C的内连接。所以取决于A左连接B的结果,将确定最终结果的结果。如果我错了,请纠正我

1 个答案:

答案 0 :(得分:2)

此查询:

SELECT *
FROM Table_a a LEFT JOIN
     Table_b b
     ON a.id = b.id INNER JOIN
     Table_c c
     ON b.id = c.id;

相当于:

SELECT *
FROM Table_a a INNER JOIN
     Table_b b
     ON a.id = b.id INNER JOIN
     table_c c
     ON b.id = c.id;

咦?这如何变成内部联接?好吧,首先现在从左到右解释SQL,因此您的查询被解释为:

SELECT *    
FROM (Table_a a LEFT JOIN
      Table_b b
      ON a.id = b.id
     ) INNER JOIN
     table_c c ON b.id = c.id;

也就是说,最后一个条件中的bleft join的结果。如果没有匹配,则b.idnull且条件不为真。因此,这些行都被过滤掉了。

使用联接时,我建议使用以下规则:

  • 首先放置所有INNER JOIN
  • LEFT JOIN用于所有后续联接。
  • 请勿使用RIGHT JOIN s。

对我来说,这适用于99.9%的查询。在某些情况下,替代方法更可取 - 我通常使用子查询。