14.1.7 Syntaxe de SELECT
14.1 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
14 Syntaxe des commandes SQL
Manuel de Référence MySQL 4.1 : Version Française
->Syntaxe de JOIN . Syntaxe de UNION
|
14.1.7.1 Syntaxe de JOIN
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. Comment MySQL optimise
LEFT 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;
|
Comment MySQL optimise
LEFT JOIN
.
|