Para INNER
junçõ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
, RIGHT
ou FULL
) OUTER
junçõ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 b
nã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 ON
condições "agradáveis" . Ambos ON b.ab_id = a.ab_id
e c.bc_id = b.bc_id
são verificações de igualdade e não envolvem NULL
comparações.
Você pode até ter condições com outros operadores ou outros mais complexos, como: ON a.x <= b.x
ou ON a.x = 7
ou ON a.x LIKE b.x
ou ON (a.x, a.y) = (b.x, b.y)
e as duas consultas ainda seriam equivalentes.
Se, no entanto, qualquer um desses envolvidos IS NULL
ou 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?