MySQL supporte les syntaxes suivantes de
JOIN
pour une utilisation dans les
SELECT
:
reference_table, reference_table reference_table [CROSS] JOIN reference_table reference_table INNER JOIN reference_table condition_jointure reference_table STRAIGHT_JOIN reference_table reference_table LEFT [OUTER] JOIN reference_table condition_jointure reference_table LEFT [OUTER] JOIN reference_table reference_table NATURAL [LEFT [OUTER]] JOIN reference_table { OJ reference_table LEFT OUTER JOIN reference_table ON expr_conditionnelle } reference_table RIGHT [OUTER] JOIN reference_table condition_jointure reference_table RIGHT [OUTER] JOIN reference_table reference_table NATURAL [RIGHT [OUTER]] JOIN reference_table
où reference_table
est définie de la
manière suivante :
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)]
et condition_jointure
est définie comme
suit :
ON expr_conditionnelle | USING (column_list)
Généralement, vous ne devez avoir aucune condition, dans la
partie ON
, qui soit utilisée pour
spécifier les lignes que vous voulez obtenir en résultat.
(il y a des exceptions à cette règle). Si vous voulez
restreindre les lignes résultantes, vous devez le faire dans
la clause WHERE
.
Notez que dans les versions antérieures à la 3.23.17,
INNER JOIN
ne prenait pas en compte
condition_jointure
!
La dernière syntaxe de LEFT OUTER JOIN
vue
plus haut, n'existe que pour assurer la compatibilité avec
ODBC :
On peut créer un alias sur une référence de table en
utilisant nom_de_table AS alias_name
ou
nom_de_table alias_name
:
mysql>SELECT t1.name, t2.salary FROM employee AS t1, info AS t2
->WHERE t1.name = t2.name;
La condition ON
est de la même forme
qu'une condition pouvant être utilisée dans la clause
WHERE
.
Si aucune ligne ne correspond dans la table de droite dans
la partie ON
ou
USING
du LEFT JOIN
,
une ligne avec toutes les colonnes mises à
NULL
est utilisé en remplacement. Vous
pouvez utiliser ce fait pour trouver les enregistrements
dans une table qui n'ont pas de correspondances dans une
autre :
mysql>SELECT table1.* FROM table1
->LEFT JOIN table2 ON table1.id=table2.id
->WHERE table2.id IS NULL;
Cet exemple retourne toutes les lignes trouvées dans
table1
avec une valeur de
id
qui n'est pas présente dans
table2
(autrement dit, toutes les
lignes de table1
sans correspondances
dans la table table2
). Cela demande que
table2.id
soit déclaré NOT
NULL
, bien sur. See
Section 7.2.9, « Comment MySQL optimise les clauses LEFT JOIN
et
RIGHT JOIN
».
La clause USING
(column_list)
recense la liste des
colonnes qui doivent exister dans les deux tables. Les
clauses USING
suivantes sont
identiques :
a LEFT JOIN b USING (c1,c2,c3) a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
La jointure de deux tables avec NATURAL [LEFT]
JOIN
est définie pour être sémantiquement
équivalent à un INNER JOIN
ou un
LEFT JOIN
avec une clause
USING
qui nomme toutes les colonnes qui
existent dans les deux tables.
INNER JOIN
et ,
(virgule) sont sémantiquement équivalents. Les deux
opèrent une jointure totale sur les tables utilisées.
Normalement, vous spécifiez les conditions de jointure
dans la clause WHERE
.
RIGHT JOIN
fonctionne de fa¸on
analogue à LEFT JOIN
. Pour garder un
code facilement portable, il est recommandé d'utiliser
les LEFT JOIN
à la place des
RIGHT JOIN
.
STRAIGHT_JOIN
est identique à
JOIN
, sauf que la table de gauche est
toujours lues avant celle de droite. Cela peut être
utilisé dans les cas (rares) où l'optimiseur des
jointures place les tables dans le mauvais ordre.
A partir de la version 3.23.12 de MySQL, vous pouvez donner
des indications à propos de l'index à utiliser lors de la
lecture d'informations d'une table. C'est utile si
EXPLAIN
montre que MySQL utilise un mauvais
index de la liste de ceux disponibles. En spécifiant
USE INDEX (liste_de_clefs)
, vous pouvez
forcer MySQL à utiliser un index spécifique pour trouver les
enregistrements dans la table. Une alternative réside dans
l'utilisation de IGNORE INDEX
(liste_de_clefs)
pour dire à MySQL de ne pas
utiliser certains index.
En MySQL 4.0.9, vous pouvez aussi utiliser la clause
FORCE INDEX
. Elle se comporte comme
USE INDEX (key_list)
mais en supposant que
les scan de tables seront très coûteux.
En d'autres termes, les scans de tables seront utilisés que
s'il n'y a pas d'autres méthodes pour trouver les lignes.
USE/IGNORE KEY
sont des synonymes de
USE/IGNORE INDEX
.
Note : USE
INDEX
, IGNORE INDEX
et
FORCE INDEX
affectent uniquement les index
qui sont utilisés lors du choix de la méthode de sélection
des lignes dans la table, et comment faire une jointure. Elles
n'affectent pas l'utilisation finale de l'index dans les
clauses ORDER BY
ou GROUP
BY
.
Quelques exemples :
mysql>SELECT * FROM table1,table2 WHERE table1.id=table2.id;
mysql>SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;
mysql>SELECT * FROM table1 LEFT JOIN table2 USING (id);
mysql>SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
->LEFT JOIN table3 ON table2.id=table3.id;
mysql>SELECT * FROM table1 USE INDEX (key1,key2)
->WHERE key1=1 AND key2=2 AND key3=3;
mysql>SELECT * FROM table1 IGNORE INDEX (key3)
->WHERE key1=1 AND key2=2 AND key3=3;
See Section 7.2.9, « Comment MySQL optimise les clauses LEFT JOIN
et
RIGHT 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.