| 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
  :
 où  
reference_table
  est définie de la manière suivante :| 
reference_table, reference_tablereference_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
 | 
 et  
condition_jointure
  est définie comme suit :| 
nom_de_table [[AS] alias] [USE INDEX (liste_de_clefs)] [IGNORE INDEX (liste_de_clefs)]
 | 
 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
  !| 
ON expr_conditionnelle |USING (column_list)
 | 
   
La dernière syntaxe de  
LEFT OUTER JOIN
  vue plus haut, n'existe que pour assurer la
compatibilité avec ODBC :
 
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.
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 : 
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
 .| 
mysql> SELECT table1.* FROM table1->        LEFT JOIN table2 ON table1.id=table2.id
 ->        WHERE table2.id IS NULL;
 | 
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.  
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 : Comment MySQL optimise 
LEFT JOIN
 .| 
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;
 | 
 |