Retour à la liste des articles Articles
11 minutes de lecture

Explication des types de jointures SQL

Quelle est la différence entre INNER JOIN, LEFT JOIN, RIGHT JOIN et FULL JOIN en SQL ? Quand devez-vous utiliser chacune d'entre elles ? Nous avons vos réponses ici.

Vous souhaitez combiner les données de deux ou plusieurs tables différentes, mais vous ne savez pas comment le faire en SQL. Ne vous inquiétez pas. Dans cet article, je vais vous montrer comment utiliser la clause SQL JOIN pour fusionner les données de deux tables. Il existe différents types de SQL JOIN que vous pouvez utiliser pour obtenir des résultats différents. Si vous souhaitez connaître les différences entre INNER JOIN, LEFT JOIN, RIGHT JOIN et FULL JOIN, poursuivez votre lecture. Cet article est fait pour vous.

Tout d'abord, commençons par les bases : qu'est-ce qu'une instruction JOIN et comment fonctionne-t-elle ?

Qu'est-ce qu'une jointure SQL ?

Une clause JOIN est utilisée lorsque vous devez combiner les données de deux ou plusieurs tables en un seul ensemble de données. Les enregistrements des deux tables sont mis en correspondance en fonction d'une condition (également appelée prédicat JOIN ) que vous spécifiez dans la clause JOIN. Si la condition est remplie, les enregistrements sont inclus dans le résultat.

Dans cet article, je vais expliquer le concept SQL JOIN et les différents types de JOIN à l'aide d'exemples. Avant d'aller plus loin, jetons un coup d'œil aux tables que nous allons utiliser dans cet article.

Apprendre à connaître la base de données

Nous allons utiliser les tables d'une base de données bancaire fictive. La première table est called account et elle contient des données relatives aux comptes bancaires des clients :

account_idoverdraft_amtcustomer_idtype_idsegment
25568891200042RET
1323598795155011RET
2225546500052RET
5516229600045RET
5356222750055RET
2221889540012RET
245568812500502CORP
13224886562500511CORP
13235987953100521CORP
13231115951220531CORP

Table Compte

Cette table contient 10 enregistrements (10 comptes) et cinq colonnes :

  • account_id - Identifie de façon unique chaque compte.
  • overdraft_amount - La limite de découvert pour chaque compte.
  • customer_id - Identifie de façon unique chaque client.
  • type_id - Identifie le type de ce compte.
  • segment - Contient les valeurs "RET" (pour les clients particuliers) et "CORP" (pour les clients entreprises).

La deuxième table s'appelle customer et contient des données relatives aux clients :

customer_idnamelastnamegendermarital_status
1MARCTESCOMY
2ANNAMARTINFN
3EMMAJOHNSONFY
4DARIOPENTALMN
5ELENASIMSONFN
6TIMROBITHMN
7MILAMORRISFN
8JENNYDWARTHFY

table des clients

Cette table contient huit enregistrements et cinq colonnes :

  • customer_id - Identifie de façon unique chaque compte.
  • name - Le prénom du client.
  • lastname - Le nom de famille du client.
  • gender- Le sexe du client (M ou F).
  • marital_status - Si le client est marié (O ou N).

Maintenant que nous disposons de ces deux tableaux, nous pouvons les combiner pour afficher des résultats supplémentaires liés aux données des clients ou des comptes. JOIN peut nous aider à obtenir des réponses à des questions telles que :

  • Qui possède chaque compte dans la account table ?
  • Combien de comptes possède Marc Tesco ?
  • Combien de comptes possède un client féminin ?
  • Quel est le montant total du découvert pour tous les comptes d'Emma Johnson ?

Pour répondre à chacune de ces questions, nous devons combiner deux tables (account et customer) en utilisant une colonne qui apparaît dans les deux tables (dans ce cas, customer_id). Une fois que nous aurons fusionné les deux tables, nous aurons les informations relatives au compte et au client dans une seule sortie.

Gardez à l'esprit que dans la table account nous avons quelques clients qui ne peuvent pas être trouvés dans la table customer table. (Les informations sur les clients d'entreprise sont stockées ailleurs.) Gardez également à l'esprit que certains ID de clients ne sont pas présents dans la table account table ; certains clients n'ont pas de compte.

Il existe plusieurs façons de combiner deux tableaux. Ou, en d'autres termes, on peut dire qu'il existe plusieurs types différents de SQL JOIN.

Les 4 types de jointures SQL

Les types SQL JOIN comprennent :

  • INNER JOIN (également appelée "simple" JOIN). Il s'agit du type de JOIN le plus courant.
  • LEFT JOIN (ou LEFT OUTER JOIN)
  • RIGHT JOIN (ou RIGHT OUTER JOIN)
  • FULL JOIN (ou FULL OUTER JOIN)
  • Les auto-jointures et les jointures croisées sont également possibles en SQL, mais nous n'en parlerons pas dans cet article. Pour plus d'informations, voir le Guide illustré de l'auto-jonction SQL et le Guide illustré de la jointure croisée SQL.

Plongeons plus profondément dans les quatre premiers types de SQL JOIN. Je vais utiliser un exemple pour expliquer la logique et la syntaxe de chaque type. On utilise parfois des diagrammes de Venn pour expliquer les types de jointures SQL. Je ne vais pas les utiliser ici, mais si c'est votre truc, consultez l'article Comment apprendre Les jointures en SQL.

INNER JOIN

INNER JOIN est utilisée pour afficher les enregistrements correspondants des deux tables. On l'appelle également une simple JOIN; si vous omettez le mot-clé INNER (ou tout autre mot-clé, comme LEFT, RIGHT ou FULL) et que vous utilisez simplement JOIN, c'est le type de jointure que vous obtiendrez par défaut.

Il y a généralement deux tables (ou plus) dans une instruction de jointure. Nous les appelons les tables de gauche et de droite. La table de gauche se trouve dans la clause FROM - et donc à gauche du mot-clé JOIN. La table de droite se trouve entre les mots-clés JOIN et ON, ou à droite du mot-clé JOIN.

Si la condition JOIN est remplie dans un INNER JOIN, cet enregistrement est inclus dans l'ensemble de données. Il peut provenir de l'une ou l'autre table. Si l'enregistrement ne correspond pas aux critères, il n'est pas inclus. L'image ci-dessous montre ce qui se passerait si la couleur bleue était le critère de jointure pour les tables de gauche et de droite :

INNER JOIN

Voyons comment INNER JOIN fonctionne dans notre exemple. Je vais faire un simple JOIN sur le compte et le client pour afficher account et customer informations dans une seule sortie :

SELECT account.*,
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
JOIN customer 
ON account.customer_id=customer.customer_id;

Voici une brève explication de ce qui se passe :

  • J'utilise JOIN parce que nous fusionnons les fichiers account et customer et .
  • Le prédicat JOIN est ici défini par l'égalité :

account.customer_id = customer.customer_id

En d'autres termes, les enregistrements sont mis en correspondance par les valeurs de la colonne customer_id:

JOIN
  • Les enregistrements qui partagent la même valeur d'ID client sont mis en correspondance. (Les enregistrements qui n'ont pas de correspondance dans l'une ou l'autre table (en gris) ne sont pas inclus dans le jeu de résultats.
  • Pour les enregistrements qui présentent une correspondance, tous les attributs de la table account sont affichés dans le jeu de résultats. Les attributs nom, nom de famille, sexe et état civil de la table customer sont également affichés.

Après avoir exécuté ce code, SQL renvoie le résultat suivant :

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY

INNER JOIN result

Comme nous l'avons mentionné précédemment, seuls les enregistrements colorés (correspondants) ont été renvoyés ; tous les autres sont rejetés. En termes commerciaux, nous avons affiché tous les comptes de détail avec des informations détaillées sur leurs propriétaires. Les comptes non commerciaux n'ont pas été affichés car les informations relatives à leurs clients ne sont pas stockées dans la table customer table.

LEFT JOIN

Parfois, vous aurez besoin de conserver tous les enregistrements de la table de gauche, même si certains n'ont pas de correspondance dans la table de droite. Dans le dernier exemple, les lignes grises ne sont pas affichées dans le résultat. Il s'agit de comptes d'entreprise. Dans certains cas, vous voudrez peut-être les avoir dans l'ensemble de données, même si leurs données client restent vides. Si nous voulons renvoyer les enregistrements non appariés de la table de gauche, nous devons écrire une requête LEFT JOIN. Ci-dessous, vous pouvez voir que la requête LEFT JOIN renvoie tous les enregistrements de la table de gauche et les lignes correspondantes de la table de droite.

LEFT JOIN

Voici à quoi ressemblerait la requête précédente si nous utilisions LEFT JOIN au lieu de INNER JOIN:

SELECT account.*,
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
LEFT JOIN customer 
ON account.customer_id=customer.customer_id;

La syntaxe est identique. Le résultat, cependant, n'est pas le même.... Nous pouvons maintenant voir les comptes d'entreprise (enregistrements gris) dans les résultats :

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY
245568812500502CORPNULLNULLNULLNULL
13224886562500511CORPNULLNULLNULLNULL
13235987953100521CORPNULLNULLNULLNULL
13231115951220531CORPNULLNULLNULLNULL

Jointure gauche - compte avec client

Remarquez comment les attributs tels que le nom, le nom de famille, le sexe et l'état civil dans les quatre dernières lignes sont remplis de NULLs. Cela est dû au fait que ces lignes grises n'ont pas de correspondance dans la table customer (c'est-à-dire que les valeurs customer_id de 50, 51 ,52 et 53 ne sont pas présentes dans la table). customer tableau). Ainsi, ces attributs ont été laissés NULL dans ce résultat.

JOINTURE DROITE

Comme LEFT JOIN, RIGHT JOIN conserve tous les enregistrements de la table de droite (même s'il n'y a pas d'enregistrement correspondant dans la table de gauche). Voici l'image familière pour vous montrer comment cela fonctionne :

JOIN DROIT

Une fois encore, nous utilisons le même exemple. Cependant, nous avons remplacé LEFT JOIN par RIGHT JOIN:

SELECT account.account_id,
      account.overdraft_amount,
      account.type_id,
      account.segment,
      account.customer_id,
      customer.customer_id
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
RIGHT JOIN customer 
ON account.customer_id=customer.customer_id;

La syntaxe est pratiquement la même. J'ai fait une autre petite modification : En plus de account.customer_id, j'ai également ajouté la colonne customer.customer_id à l'ensemble des résultats. Je l'ai fait pour vous montrer ce qui arrive aux enregistrements de la table customer qui n'ont pas de correspondance dans la table de gauche (account) de gauche.

Voici le résultat :

account_idoverdraft_amounttype_idsegmentcustomer_idcustomer_idnamelastnamegendermarital_status
132359879515501RET11MARCTESCOMY
222188954002RET11MARCTESCOMY
NULLNULLNULLNULLNULL2ANNAMARTINFN
NULLNULLNULLNULLNULL3EMMAJOHNSONFY
2556889120002RET44DARIOPENTALMN
551622960005RET44DARIOPENTALMN
222554650002RET55ELENASIMSONFN
535622275005RET55ELENASIMSONFN
NULLNULLNULLNULLNULL6TIMROBITHMN
NULLNULLNULLNULLNULL7MILAMORRISFN
NULLNULLNULLNULLNULL8JENNYDWARTHFY

RIGHT JOIN résultat

Comme vous pouvez le constater, tous les enregistrements de la table de droite ont été inclus dans le jeu de résultats. N'oubliez pas :

  • Les ID de clients non appariés de la table de droite (numéros 2, 3, 6, 7 et 8, affichés en gris) ont leurs attributs de compte définis sur NULL dans ce jeu de résultats. Il s'agit de clients de détail qui n'ont pas de compte bancaire - et donc aucun enregistrement dans la table account dans la table.
  • Vous pouvez vous attendre à ce que la table résultante contienne huit enregistrements, car c'est le nombre total d'enregistrements dans la table. customer table. Or, ce n'est pas le cas. Nous avons 11 enregistrements car les ID clients 1, 4 et 5 ont chacun deux comptes dans la table. account table. Toutes les correspondances possibles sont affichées.

JOINTURE COMPLÈTE (EXTERNE)

Je vous ai montré comment conserver tous les enregistrements des tables de gauche ou de droite. Mais que se passe-t-il si vous voulez conserver tous les enregistrements des deux tables ? Dans notre cas, vous souhaitez afficher tous les enregistrements correspondants, tous les comptes d'entreprise et tous les clients sans compte. Pour ce faire, vous pouvez utiliser FULL OUTER JOIN. Ce type JOIN associera toutes les colonnes correspondantes et affichera également toutes les colonnes non correspondantes des deux tables. Les attributs non familiers seront remplis avec NULLs. Regardez l'image ci-dessous :

JOINTURE COMPLÈTE (EXTERNE)

Voici la syntaxe complète de OUTER JOIN:

SELECT account.*,
      CASE WHEN customer.customer_id IS NULL
                 THEN account.customer_id 
                 ELSE customer.customer_id 
       END customer_id
      customer.name,
      customer.lastname,
      customer.gender,
      customer.marital_status
FROM account 
FULL JOIN customer 

ON account.customer_id=customer.customer_id;

Maintenant le résultat ressemble à ceci :

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY
245568812500502CORPNULLNULLNULLNULL
13224886562500511CORPNULLNULLNULLNULL
13235987953100521CORPNULLNULLNULLNULL
13231115951220531CORPNULLNULLNULLNULL
NULLNULL2NULLNULLANNAMARTINFN
NULLNULL3NULLNULLEMMAJOHNSONFY
NULLNULL6NULLNULLTIMROBITHMN
NULLNULL7NULLNULLMILAMORRISFN
NULLNULL8NULLNULLJENNYDWARTHFY

Résultat de la jointure externe complète

Remarquez que les attributs de compte des cinq dernières lignes sont remplis de NULL. Ceci est dû au fait que ces clients n'ont pas d'enregistrements dans la table account dans la table. Remarquez également que les clients 50, 51, 52 et 53 ont des noms et prénoms et d'autres attributs de la table remplis de NULL. customer de la table sont remplis de NULL. Ceci est dû au fait qu'ils n'existent pas dans la table. customer table. Ici, customer_id dans la table de résultats n'est jamais NULL parce que nous avons défini customer_id avec une instruction CASE WHEN:

CASE WHEN customer.customer_id IS NULL
                 THEN account.customer_id 
                 ELSE customer.customer_id END customer_id

Cela signifie en fait que customer_id dans la table de résultat est une combinaison de account.customer_id et customer.customer_id (c'est-à-dire que lorsque l'une est NULL, on utilise l'autre). Nous pourrions également afficher les deux colonnes dans la sortie, mais cette déclaration CASE WHEN est plus pratique.

Ce n'est pas grave si vous êtes confus par toutes les différentes Les jointures en SQL et ce qu'elles font. Il suffit de s'y faire. Je vous recommande de consulter notre aide-mémoire sur les jointures SQL. Gardez-la près de vous ; elle est très utile pour coder. Il est également utile de consulter notre article sur la pratique de Les jointures en SQL. Plus vous apprendrez et pratiquerez, plus le site Les jointures en SQL sera clair.

Suivant : Pratiquez Les jointures en SQL

Dans cet article, nous avons présenté différents types de SQL JOIN. Les jointures internes, gauches, droites et complètes renvoient toutes des résultats différents. Vous devez maintenant mettre ces connaissances en pratique ! Sur LearnSQL.fr vous trouverez d'autres exemples pour vous entraîner. Nos cours interactifs SQL Queries et Les jointures en SQL couvrent les sujets relatifs aux jointures, je vous encourage donc à les essayer.