Retour à la liste des articles Articles
9 minutes de lecture

Comment effectuer une jointure gauche de plusieurs tables en SQL

Peut-on faire une LEFT JOIN de trois tables en SQL ? Oui, bien sûr ! Vous pouvez utiliser plusieurs LEFT JOINs dans une requête si cela est nécessaire pour votre analyse. Dans cet article, je vais vous montrer, à l'aide de quelques exemples, comment réaliser une LEFT JOIN de plusieurs tables en SQL et comment éviter certains pièges courants.

Qu'est-ce qu'une LEFT JOIN ?

Commençons par nous rappeler ce qu'est une LEFT JOIN et comment l'utiliser. Vous vous souvenez peut-être qu'une JOIN INNER ne renvoie que les enregistrements qui se trouvent dans les deux tables. En revanche, une LEFT JOIN en SQL renvoie tous les enregistrements (ou lignes) de la table de gauche et uniquement les enregistrements (ou lignes) correspondants de la table de droite. Cela implique que, si une ligne spécifique est présente dans la table de gauche mais pas dans celle de droite, le résultat inclura cette ligne, mais avec une valeur NULL dans chaque colonne de droite. Si un enregistrement de la table de droite n'est pas dans la table de gauche, il ne sera pas inclus dans le résultat.

Joindre

La syntaxe générale d'une LEFT JOIN est la suivante :

SELECT noms_des_colonnes
FROM table1
LEFT JOIN table2
  ON table1.colonne_commune = table2.colonne_commune;

Si vous voulez plus d'informations sur les jointures SQL, consultez ce guide complet. Si vous souhaitez vous entraîner à différents types de jointures, consultez notre cours interactif avec plus de 90 exercices pratiques. Les jointures en SQL cours interactif comprenant plus de 90 exercices pratiques.

LEFT JOIN est fréquemment utilisé pour des tâches analytiques. Tout d'abord, elle est très utile pour identifier les enregistrements d'une table donnée qui n'ont pas d'enregistrements correspondants dans une autre. Dans ce cas, vous pouvez ajouter une clause WHERE à la requête afin de sélectionner, dans le résultat de la jointure, les lignes ayant des valeurs NULL dans toutes les colonnes de la deuxième table. Cependant, assurez-vous d'abord que votre deuxième table ne contient pas d'enregistrements avec des valeurs NULL dans toutes les colonnes, à l'exception du champ commun utilisé pour la jointure. Vous pouvez aussi utiliser une colonne de la deuxième table qui est entièrement remplie et ne contient pas de valeurs NULL, s'il y en a une.

Voici un autre scénario. Imaginons que nous gérions une librairie en ligne et que nous voulions comparer les clients ayant passé des commandes au cours des six derniers mois avec ceux qui ont été inactifs pendant la même période. Dans ce cas, nous voulons que le résultat comprenne TOUS les clients, qu'ils soient actifs ou inactifs, en joignant les données sur nos clients aux données sur les ventes récentes. Il s'agit d'une utilisation parfaite d'une JOINTURE GAUCHE.

Voici les clients et ventes de notre librairie.

clients

idprenomnom_de_famillesexeageclient_depuis
1DanielBlackM342014-10-13
2ErikBrownM252015-06-10
3DianaTrumpF392015-10-25
4AnnaYaoF192017-02-20
5ChristianSandersM422018-01-31

ventes

iddatelivre_idclient_idquantitemontant
12019-09-0223114.99
22019-10-0112112.99
32019-10-0134115.75

Pour joindre ces deux tables et obtenir les informations dont nous avons besoin pour l'analyse, utilisez la requête SQL suivante :

SELECT c.id, c.prenom, c.nom_de_famille, c.sexe, c.age, c.client_depuis,    
       s.date AS date_de_vente, sum(s.montant) AS total_depense
FROM clients c
LEFT JOIN ventes s
ON c.id = s.client_id
GROUP BY c.id;

Avec cette requête, nous conservons tous les enregistrements concernant les clients, nous ajoutons la date des ventes et nous calculons le montant total dépensé. Dans le tableau ci-dessous, les lignes qui seraient présentes dans le INNER JOIN sont surlignées en bleu, tandis que le jaune indique les enregistrements supplémentaires dus au LEFT JOIN.

idprenomnom_de_famillesexeageclient_depuisdate_de_ventetotal_depense
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-0112.99
3DianaTrumpF392015-10-252019-09-0214.99
4AnnaYaoF192017-02-202019-10-0115.75
5ChristianSandersM422018-01-31[NULL][NULL]

Comme vous pouvez le constater, les clients n'ayant effectué aucun achat au cours de la période donnée ont une valeur NULL pour la date de vente et le montant total dépensé, puisque leurs enregistrements ne sont pas présents dans la table ventes table. C'est ainsi que fonctionne une LEFT JOIN. Vous pouvez vous entraîner à utiliser les LEFT JOIN et d'autres types de jointures dans notre cours complet Les jointures en SQL ou consulter notre La pratique du SQL avec de nombreux exercices SQL pour vous entraîner à diverses constructions SQL.

Maintenant, plongeons dans des cas plus compliqués !

Plusieurs LEFT JOINs dans une requête

Parfois, vous devez effectuer une LEFT JOIN sur plus de deux tables pour obtenir les données nécessaires à des analyses spécifiques. Heureusement, le mot-clé LEFT JOIN peut être utilisé avec plusieurs tables en SQL.

Prenons un exemple. Nous voulons analyser l'impact de notre récente campagne promotionnelle sur le comportement de nos clients.

Promotions

idcampagneclient_iddate
1SMS_discount1022019-09-01
2SMS_discount1032019-09-01
3SMS_discount1052019-09-01

Pour ce faire, nous devons combiner les données de clients, ventes, et promotions.

SELECT c.id, c.prenom, c.nom_de_famille, c.sexe, c.age, c.client_depuis, 
   s.date AS vente, p.date AS promotion
FROM clients c
LEFT JOIN ventes s
ON c.id = s.client_id
LEFT JOIN promotions p
ON c.id = p.client_id;

Voici le résultat de la jointure :

idprenomnom_de_famillesexeageclient_depuisventepromotion
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-012019-09-01
3DianaTrumpF392015-10-252019-09-022019-09-01
4AnnaYaoF192017-02-202019-10-01[NULL]
5ChristianSandersM422018-01-31[NULL]2019-09-01

Comme vous pouvez le voir, en utilisant une LEFT JOIN, nous avons conservé les enregistrements de tous nos clients, indépendamment de leur historique d'achat ou de leur participation aux campagnes promotionnelles. Par exemple, le client 1 figure dans le résultat de la jointure même s'il n'a pas effectué d'achat et n'a pas reçu de message promotionnel. Nous avons également le client 4 qui a acheté un livre, mais n'a reçu aucun message promotionnel, ainsi que le client 5 qui a reçu un message promotionnel, mais n'a effectué aucun achat. Enfin, les clients qui ont effectué des achats et reçu des messages promotionnels (clients 2 et 3) sont également inclus dans le résultat.

Notez que dans cet exemple, nous avons utilisé un champ commun de la première table pour joindre la deuxième et la troisième table. Cependant, ce n'est pas toujours le cas. Examinons un cas dans lequel un champ commun de la deuxième table est utilisé pour effectuer une jointure à gauche avec la troisième table, mais pas avec la première.

Nous voulons savoir quels genres de livres intéressent le plus nos clients. Ces informations sont très précieuses, car elles nous aident à offrir une expérience plus personnalisée à nos clients en leur recommandant des livres spécifiques. Pour cette analyse, nous aurons besoin des données de clients, ventes, et livres. Nous avons déjà joint les deux premiers dans notre premier exemple ; à cela, nous allons ajouter la table livres.

livres

idnomauteurgenrequantiteprix
1The Lord of the RingsJ. R. R. Tolkienfantasy712.99
2LolitaVladimir Nabokovnovel414.99
4The HobbitJ. R. R. Tolkienfantasy1010.75
5Death on the NileAgatha Christiedetective89.75

Pour obtenir les données nécessaires à l'analyse des livres et des genres préférés de nos clients, utilisez la requête suivante :

SELECT c.id, c.prenom, c.nom_de_famille, s.date AS vente, 
 b.nom AS livre, b.genre
FROM clients c
LEFT JOIN ventes s
ON c.id = s.client_id
LEFT JOIN livres b
ON s.livre_id = b.id;

Voici le résultat de la jointure, dans lequel les données des clients sont combinées avec les données sur les livres achetés récemment (le cas échéant).

idprenomnom_de_familleventelivregenre
1DanielBlack[NULL][NULL][NULL]
2ErikBrown2019-10-01The Lord of the Ringsfantasy
3DianaTrump2019-09-02Lolitanovel
4AnnaYao2019-10-01[NULL][NULL]
5ChristianSanders[NULL][NULL][NULL]

Nous avons deux clients (1 et 5) qui n'ont rien acheté et n'ont donc pas d'enregistrement correspondant dans la table ventes. Cependant, ces lignes sont conservées en utilisant un LEFT JOIN. De plus, la table comprend la ligne correspondant au client 4 qui a récemment acheté un livre qui ne se trouve pas dans notre base de données et qui n'a donc pas de données dans la table livres. Le résultat de la jointure inclut toujours cet enregistrement en raison de la LEFT JOIN.

Comme vous pouvez le constater, LEFT JOIN en SQL peut être utilisé avec plusieurs tables. Toutefois, pour être sûr d'obtenir les résultats escomptés, soyez conscient des problèmes qui peuvent survenir lorsque vous joignez plus de deux tables.

Éléments à prendre en compte en cas de jointures multiples (LEFT JOIN)

La jonction de plusieurs tables en SQL peut s'avérer délicate. Voici quelques points à prendre en compte lors de l'utilisation de LEFT JOINs, en particulier avec plusieurs tables.

Contrairement à la jointure INNER JOIN, l'ordre des tables joue un rôle important dans la jointure LEFT JOIN, et les résultats peuvent être complètement différents si l'ordre change dans votre requête SQL. Pour déterminer l'ordre des tables dans un LEFT JOIN, la règle générale est de commencer par la table dont vous souhaitez conserver tous les enregistrements dans le résultat final.

N'oubliez pas non plus qu'une LEFT JOIN se répercute sur toutes les jointures d'une requête. Si vous utilisez une LEFT JOIN, les tables suivantes doivent souvent être également jointes à gauche. Une jointure intérieure (INNER JOIN) éliminera les enregistrements non trouvés des deux côtés de la jointure, et vous risquez de perdre tous les enregistrements que vous souhaitez conserver - c'est la raison pour laquelle vous utilisez une LEFT JOIN au lieu de la jointure intérieure habituelle.

En outre, une LEFT JOIN doit être utilisée pour la troisième table lorsque la première table contient des enregistrements qui ne se trouvent pas dans la deuxième (ce qui est courant pour les LEFT JOINs !) et qu'un champ commun différent est utilisé pour joindre la deuxième et la troisième table. Si vous utilisez un INNER JOIN dans cette situation, vous éliminerez tous les enregistrements de la première table qui ne correspondent pas aux deuxième et troisième tables.

C'est le cas de notre exemple ci-dessus, dans lequel nous avons joint les tables clients, ventes et livres. Voyons ce qui se passe si nous utilisons un INNER JOIN au lieu d'un LEFT JOIN pour ajouter les données de la table livres.

SELECT c.id, c.prenom, c.nom_de_famille, s.date AS vente, 
 b.nom AS livre, b.genre
FROM clients c
LEFT JOIN ventes s
ON c.id = s.client_id
INNER JOIN livres b
ON s.livre_id = b.id;
idprenomnom_de_familleventelivregenre
2ErikBrown2019-10-01The Lord of the Ringsfantasy
3DianaTrump2019-09-02Lolitanovel

Comme vous pouvez le voir, nous n'obtenons plus que deux enregistrements au lieu de cinq. Lorsque nous avons joint en utilisant un INNER JOIN, nous avons perdu un enregistrement correspondant à l'achat du livre qui n'est pas dans la table livres. Nous avons également perdu les informations sur les deux clients n'ayant pas effectué d'achats récents, les enregistrements que nous devions conserver en joignant la table ventes à gauche. En effet, nous avons joint la troisième table en utilisant un champ commun avec la deuxième, et cette colonne est NULL pour toutes les lignes de la première table qui ne se trouvent pas dans la deuxième. Par conséquent, ces enregistrements ne correspondent pas à la troisième table, et ils sont ensuite supprimés par INNER JOIN dans la dernière partie de notre requête.

Il est temps de s'entraîner à utiliser plusieurs LEFT JOINs !

Vous avez beaucoup appris sur les les jointures LEFT JOIN ! Vous connaissez même maintenant les nuances de la jointure gauche de plusieurs tables dans une requête SQL. Mettons en pratique nos compétences nouvellement acquises :

  • Notre cours Les jointures en SQL propose des exercices pratiques complets sur différents types de jointures, notamment LEFT JOIN, INNER JOIN, les auto-jointures, les non-équi-jointures et, bien sûr, les jointures de plusieurs tables dans une même requête.
  • Notre piste La pratique du SQL propose plusieurs cours pratiques interactifs sur le langage SQL pour mettre en pratique différentes constructions SQL, telles que les jointures, les GROUP BY, les agrégations, etc.

Merci de votre lecture et bon apprentissage !