Médiaforma

All posts tagged jointures complexes

Pour mieux comprendre les différences entre les jointures simples et les jointures complexes, rien de tel que quelques exemples.

En utilisant l’interface Web phpMyAdmin, définissez la table categories composée de deux champs :

  • id_categorie de type int(11), auto incrémenté ;
  • nom de type text.

Et la table articles, composée de trois champs :

  • id_categorie de type int(11), auto incrémenté ;
  • titre de type text ;
  • catégorie de type int(11).

Ajoutez les données suivantes dans la table categories :

Et ajoutez les données suivantes dans la table articles :

Vous allez maintenant utiliser l’onglet SQL pour appliquer des requêtes SQL sur les tables categories et articles.

Commencez par définir une jointure simple sur les champs categorie de la table articles et id_categories de la table categories :

SELECT * FROM articles, categories
WHERE articles.categorie = categories.id_categorie

Exécutez cette requête.

Voici le résultat. Vous remarquez que les articles d’id 8 et 9 ainsi que la catégorie 5 ne font pas partie des résultats. Ceci est “normal” puisqu’aucune correspondance n’existe entre les champs categorie de la table articles et id_categorie de la table categories :

Essayons la même requête, mais cette fois-ci en utilisant un INNER JOIN :

SELECT * FROM articles INNER JOIN categories
ON articles.categorie = categories.id_categorie;

Vous pouvez vérifier que le résultat est identique.

Essayons la même requête mais cette fois-ci en utilisant un LEFT JOIN :

SELECT * FROM articles LEFT JOIN categories
ON articles.categorie = categories.id_categorie;

Cette fois-ci, les enregistrements de la première table qui n’ont pas de correspondance dans la deuxième font partie des résultats :

Notre quatrième et dernier essai utilisera un RIGHT JOIN :

SELECT * FROM articles RIGHT JOIN categories
ON articles.categorie = categories.id_categorie;

Cette fois-ci, les enregistrements de la deuxième table qui n’ont aucune correspondance dans la première font partie des réponses :


Les requêtes SQL traditionnelles sont construites sur cette syntaxe :

SELECT [un ou plusieurs champs] FROM [une ou plusieurs tables]
 WHERE [une ou plusieurs conditions];

Les jointures simples sont effectuées dans la clause WHERE. Par contre, les jointures complexes se font entre le FROM et le WHERE via des mots clés spécifiques : INNER JOIN, LEFT JOIN ou RIGHT JOIN.

Les requêtes SQL complexes ont donc une syntaxe différente :

SELECT [un ou plusieurs champs] FROM [une ou plusieurs tables]
 [INNER | LEFT | RIGHT] JOIN [champ de jointure]
 WHERE [une ou plusieurs conditions]

Examinons une requête INNER JOIN

La requete SELECT simple :

SELECT * FROM orders, order_details
          WHERE orders.OrderID=order_details.OrderID;

Devient :

SELECT * FROM orders INNER JOIN order_details
          ON orders.OrderID=order_details.OrderID

Seule la syntaxe change : le comportement à l’exécution est identique.

Examinons une requête LEFT JOIN

Les requêtes de type LEFT JOIN sont plus permissives que les autres requêtes. Supposons qu’il existe des enregistrements dans la première table pour lesquels le champ sur lequel s’effectue la jointure ne soit pas renseigné. Dans une jointure simple, ils seront purement et simplement ignorés. Dans une jointure de type LEFT JOIN, ils seront retenus, mais la valeur NULL apparaîtra pour ces enregistrements dans le champ utilisé pour effectuer la jointure ainsi que dans tous les champs de la deuxième table.

La requete SELECT simple :

SELECT * FROM orders, order_details
          WHERE orders.OrderID=order_details.OrderID;

Devient :

SELECT * FROM orders LEFT JOIN order_details
          ON orders.OrderID=order_details.OrderID

Pour terminer, examinons les requêtes RIGHT JOIN

Les requêtes de type RIGHT JOIN sont comparables aux requêtes LEFT JOIN. Supposons qu’il existe des enregistrements dans la deuxième table pour lesquels le champ sur lequel s’effectue la jointure ne soit pas renseigné. Dans une jointure simple, ils seront purement et simplement ignorés. Dans une jointure de type RIGHT JOIN, ils seront retenus, mais la valeur NULL apparaîtra pour ces enregistrements dans le champ utilisé pour effectuer la jointure ainsi que dans tous les champs de la première table.

La requete SELECT simple :

SELECT * FROM orders, order_details
          WHERE orders.OrderID=order_details.OrderID;

Devient :

SELECT * FROM orders RIGHT JOIN order_details
          ON orders.OrderID=order_details.OrderID