A LEFT JOIN B
est implémenté dans MySQL
comme suit :
La table B
est censée être dépendante
de la table A
et de toutes les tables
dont dépend A
.
La table A
est censée être dépendante
de toutes les tables (à part B
) qui sont
utilisées dans la condition du LEFT
JOIN
.
Toutes les conditions du LEFT JOIN
sont
transmises à la clause WHERE
.
Toutes les optimisations standards de jointures sont effectuées, à l'excepté qu'une table est toujours lue après celles dont elle dépend. S'il y a une dépendance circulaire, MySQL retournera une erreur.
Toutes les optimisations standards de
WHERE
sont effectuées.
S'il y a une ligne dans A
qui répond à
la clause WHERE
, mais qu'il n'y avait
aucune ligne dans B
qui répondait à la
condition du LEFT JOIN
, alors une ligne
supplémentaire de B
est générée avec
toutes les colonnes mises à NULL
.
Si vous utilisez LEFT JOIN
pour trouver
les enregistrements qui n'existent pas dans d'autres tables
et que vous effectuez le test suivant :
nom_colonne IS NULL
dans la partie
WHERE
, où nom_colonne
est une colonne qui est déclarée en tant que NOT
NULL
, alors MySQL arrêtera de chercher d'autres
lignes (pour une combinaison de clefs particulière) après
avoir trouvé une ligne qui répond à la condition du
LEFT JOIN
.
RIGHT JOIN
est implémenté de manière
analogue à LEFT JOIN
.
L'ordre de lecture de tables forcé par LEFT
JOIN
et STRAIGHT JOIN
aidera
l'optimiseur de jointures (qui calcule l'ordre dans lequel les
tables doivent être jointes) à faire son travail plus
rapidement, puisqu'il y aura moins de permutations de tables à
vérifier.
Notez que ce qui précède signifie que si vous faites une requête de la sorte :
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;
Un palliatif est de changer la requête en :
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key) WHERE b.key=d.key;
Depuis la version 4.0.14, MySQL effectue l'optimisation
LEFT JOIN
suivante : si la condition
WHERE
est toujours fausse pour la ligne
NULL
générée, la jointure LEFT
JOIN
est transformée en jointure normale.
Par exemple, dans la requête suivante, la clause
WHERE
sera fausse si
t2.column
est NULL
: il
est donc valide de convertir la jointure en une jointure
normale.
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
Par conséquent, il est possible de convertir la requête en jointure normale :
SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
Cela peut se faire plus rapidement, car MySQL peut maintenant
utiliser la table t2
avant la table
t1
si les relations sont plus favorables.
Pour forcer l'utilisation spécifique d'un ordre de table,
utilisez STRAIGHT JOIN
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.