7.12 JOIN

MySQL utilise les syntaxes suivantes pour les commandes de JOIN:

table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference INNER JOIN table_reference
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional_expression 
table_reference LEFT [OUTER] JOIN table_reference USING (column_list)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional_expression  }

La dernière syntaxe LEFT OUTER JOIN n'existe que pour assurer la compatibilité avec ODBC.

  • Les références sur les tables peuvent être des alias.
mysql> select t1.name, t2.salary from employee AS t1, info AS t2
           where t1.name = t2.name;
  • INNER JOIN et , (comma) sont équivalents. Les deux effectuent un regroupement des tables utilisées. Normalement, il faut préciser comment les tables sont reliées avec la condition WHERE .
  • La condition ON est identique à WHERE.
  • Si il n'y a pas de lignes qui correspondent à la table de gauche, dans la clause LEFT JOIN, une ligne dont toutes les colonnes sont mises à NULL est générée. Ceci permet de rechercher les lignes d'une table qui n'ont pas de contrepartie dans une autre table.
mysql> select table1.* from table1
           LEFT JOIN table2 ON table1.id=table2.id
           where table2.id is NULL;

Cet exemple recherche toutes les lignes dans la table1 avec une colonne id qui n'est pas présent dans la table table2 (i.e., toutes les lignes de la table table1 qui n'ont pas de ligne correspondantes dans la table table2). Cela implique que a été déclaré table1.id, bien entendu !

  • La clause USING column_list spécifie une liste de nom de colonne qui doivent exister dans toutes les tables. Une utilisation telle que
A LEFT JOIN B USING (C1,C2,C3,...)

Correspond à l'utilisation d'une clause ON comme ceci :

A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3,...
  • La clause NATURAL LEFT JOIN de deux tables est équivalent à utilisation de la clause LEFT JOIN avec USING, en précisant les noms de toutes les colonnes qui existent dans les deux tables.
  • STRAIGHT_JOIN est identique à JOIN, à l'exception du fait que la table de gauche est lue avant la table de droite. Cela est pratique pour les (rares) cas où l'optimiseur de regroupement utilise les tables dans le mauvais ordre .

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;

LEFT JOIN optimization.