Para INNERjunções, não, o pedido não importa. As consultas retornarão os mesmos resultados, desde que você altere suas seleções de SELECT *para SELECT a.*, b.*, c.*.
Para ( LEFT, RIGHTou FULL) OUTERjunções, sim, a ordem é importante - e ( atualizadas ) as coisas são muito mais complicadas.
Primeiro, as junções externas não são comutativas; portanto, a LEFT JOIN bnão é o mesmo queb LEFT JOIN a
Junções externas também não são associativas, portanto, em seus exemplos que envolvem as propriedades (comutatividade e associatividade):
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
é equivalente a :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
mas:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
não é equivalente a :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
Outro exemplo (talvez mais simples) de associatividade. Pense nisso como (a LEFT JOIN b) LEFT JOIN c:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
Isso é equivalente a a LEFT JOIN (b LEFT JOIN c):
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
somente porque temos ONcondições "agradáveis" . Ambos ON b.ab_id = a.ab_ide c.bc_id = b.bc_idsão verificações de igualdade e não envolvem NULLcomparações.
Você pode até ter condições com outros operadores ou outros mais complexos, como: ON a.x <= b.xou ON a.x = 7ou ON a.x LIKE b.xou ON (a.x, a.y) = (b.x, b.y)e as duas consultas ainda seriam equivalentes.
Se, no entanto, qualquer um desses envolvidos IS NULLou uma função relacionada a nulos COALESCE(), como , por exemplo, se a condição fosse b.ab_id IS NULL, as duas consultas não seriam equivalentes.
<blahblah>? você está juntando A a B e A a C, ou você está juntando A a B e B a C?