Pour les INNER
jointures, non, l'ordre n'a pas d'importance. Les requêtes renverront les mêmes résultats, tant que vous modifiez vos sélections de SELECT *
à SELECT a.*, b.*, c.*
.
Pour ( LEFT
, RIGHT
ou FULL
) les OUTER
jointures, oui, les questions d'ordre - et ( mises à jour ) les choses sont beaucoup plus compliquées.
Premièrement, les jointures externes ne sont pas commutatives, ce a LEFT JOIN b
n'est donc pas la même chose queb LEFT JOIN a
Les jointures externes ne sont pas associatives non plus, donc dans vos exemples qui impliquent à la fois les propriétés (commutativité et associativité):
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
équivaut à :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
mais:
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'est pas équivalent à :
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
Un autre exemple d'associativité (espérons-le plus simple). Considérez cela comme (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
Cela équivaut à 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
seulement parce que nous avons des ON
conditions «agréables» . Les deux ON b.ab_id = a.ab_id
et c.bc_id = b.bc_id
sont des contrôles d'égalité et n'impliquent pas de NULL
comparaisons.
Vous pouvez même avoir des conditions avec d'autres opérateurs ou des plus complexes comme: 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)
et les deux requêtes seraient toujours équivalentes.
Cependant, si l'un de ces éléments était impliqué IS NULL
ou une fonction liée à des valeurs nulles comme COALESCE()
, par exemple, si la condition l'était b.ab_id IS NULL
, les deux requêtes ne seraient pas équivalentes.
<blahblah>
? vous joignez A à B et A à C, ou vous joignez A à B et B à C?