Formation PUB200 : MySQL, 2018 Jointures

10.6 Requête avec plus d'une jointure


Il est possible d'effectuer des requêtes qui comportent plus d'une jointure.

Par exemple, si on voulait afficher le nom du client (et son prénom) pour un rendez-vous donné, on constate qu'il n'y a pas de lien direct entre les tables clients et rendezvous. On devra nécessairement passer par la table voitures puisque c'est elle qui fait le lien entre rendezvous et clients.

Nécessite jointure double

On utilisera donc la requête suivante :

MySQL

SELECT rendezvous.id, prenom, nomfamille FROM clients

INNER JOIN voitures ON client_id = clients.id

INNER JOIN rendezvous ON voiture_id = voitures.id;

Attention aux jointures externes

Lorsqu'une requête nécessite plus d'une jointure, il est aussi possible d'utiliser des jointures externes. Notez cependant que lorsque plusieurs jointures sont utilisées dans la même requête, toutes les jointures situées à gauche d'une jointure interne seront considérées comme internes.

Il n'est pas possible de mettre un OUTER JOIN suivi d'un INNER JOIN puisque les deux jointures seront considérées comme internes.

Ex : pour faire apparaître la liste de tous les clients ayant eu ou non des rendez-vous avec, pour chacun, la date du rendez-vous s'il y a lieu, on pourra utiliser la requête suivante :

MySQL

SELECT clients.id, prenom, nomfamille, date FROM rendezvous

INNER JOIN voitures ON voiture_id = voitures.id

RIGHT OUTER JOIN clients ON client_id = clients.id;

La jointure externe pointe à droite donc la table de droite (clients) peut avoir des enregistrements qui n'ont pas de correspondance dans la table voitures.

On voit donc clairement les dates des rendez-vous de Jacinthe Courtois, de Marc Frenette, de Louis Gagnon et de Marco D'Argy. On voit également que Line Jacques, Martin Bellemare et les suivants n'ont eu aucun rendez-vous.

Requête avec deux jointures

Notez que la requête suivante ne fonctionnerait pas :

MySQL

SELECT clients.id, prenom, nomfamille, date FROM clients

LEFT OUTER JOIN voitures ON client_id = clients.id

INNER JOIN rendezvous ON voiture_id = voitures.id;

Dans le résultat de cette requête, on ne verrait pas les clients n'ayant aucun rendez-vous puisque la requête aurait été traitée comme s'il s'agissait de deux INNER JOIN.

Par contre, la requête suivante fonctionnerait puisqu'on a fait suivre le LEFT OUTER JOIN par un autre LEFT OUTER JOIN. On obtiendrait pratiquement les mêmes résultats qu'avec le INNER JOIN suivi d'un RIGHT OUTER JOIN.

MySQL

SELECT clients.id, prenom, nomfamille, date FROM clients

LEFT OUTER JOIN voitures ON client_id = clients.id

LEFT OUTER JOIN rendezvous ON voiture_id = voitures.id;

Remarquez qu'on a utilisé un LEFT OUTER JOIN à la suite du LEFT OUTER JOIN afin de poursuivre le sens de la jointure externe.

Requête avec deux jointures

Les résultats obtenus sont légèrement différents de ceux de la requête avec un INNER JOIN suivi d'un RIGHT OUTER JOIN :

  • L'ordre dans lequel les enregistrements apparaissent est différent. Ceci est dû à l'algorithme que le SGBD utilise pour retrouver les données.
  • Certains enregistrements sont différents à cause de l'ordre dans lequel MySQL a fait ses jointures. Dans ce cas-ci, Marco D'Argy possède deux voitures, dont une qui n'a jamais eu de rendez-vous. C'est pourquoi son nom apparaît deux fois : une fois avec une date de rendez-vous et une autre sans date. Dans la première version, il n'apparaissait qu'une seule fois puisque la jointure externe avec clients était réalisée à partir de la jointure interne entre voitures et rendezvous.

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre