最近我对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的结果,将确定最终结果的结果。如果我错了,请纠正我
答案 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;
也就是说,最后一个条件中的b
是left join
的结果。如果没有匹配,则b.id
为null
且条件不为真。因此,这些行都被过滤掉了。
使用联接时,我建议使用以下规则:
INNER JOIN
。LEFT JOIN
用于所有后续联接。RIGHT JOIN
s。对我来说,这适用于99.9%的查询。在某些情况下,替代方法更可取 - 我通常使用子查询。