Retour à la liste des articles Articles
11 minutes de lecture

Comment joindre 3 tables (ou plus) en SQL

L'utilisation de JOIN en SQL ne signifie pas que vous ne pouvez joindre que deux tables. Vous pouvez en joindre 3, 4, voire plus ! Les possibilités sont illimitées.

Si vous venez d'apprendre JOINs en SQL, vous pouvez penser qu'il est limité à deux tables. Ce n'est pas surprenant - ce concept peut être difficile à comprendre, et l'idée que les JOIN puissent devenir encore plus compliqués peut être vraiment effrayante au début. La vérité est que vous pouvez facilement étendre cette idée à trois tables ou même plus. Regardez la requête ci-dessous :

SELECT
  etudiant.prenom,
  etudiant.nom_de_famille,
  cours.nom
FROM etudiant
JOIN etudiant_cours
  ON etudiant.id = etudiant_cours.etudiant_id
JOIN cours
  ON cours.id = etudiant_cours.cours_id;

Nous avons simplement répété la clause JOIN et joint trois tables. Nous allons approfondir la requête et les tables dans la section suivante.

Mais avant de continuer, je vous recommande vivement de bien comprendre les clauses JOIN de SQL. Le concept que je vais expliquer repose fortement sur des connaissances de base. Si vous n'êtes pas encore à ce niveau, consultez le cours sur Les jointures en SQL à l'adresse suivante LearnSQL.fr.

Apprendre à connaître les données

Tout d'abord, présentons quelques tables. Voici le schéma :

Dans le diagramme entité-relation (ERD) ci-dessus, vous pouvez voir les tables, leurs colonnes, les types de données des colonnes et les liens entre les tables. Par exemple, il existe un lien entre les tables etudiant et etudiant_cours chaque étudiant peut être lié à plusieurs lignes de la table etudiant_cours . Pour plus d'informations sur la lecture d'un schéma, voir l'article Crow's Foot Notation sur le blog Vertabelo.

Les données de notre exemple sont stockées dans quatre tables. Pour l'instant, nous allons nous concentrer sur les trois premières tables :

  • etudiant - Contient des informations sur les étudiants :
    • id - L'identifiant de l'étudiant.
    • prenom - Le prénom de l'étudiant.
    • nom_de_famille - Le nom de famille de l'étudiant.
  • etudiant_cours - Contient des informations sur les étudiants et les cours qu'ils suivent :
    • etudiant_id - L'ID de l'étudiant.
    • cours_id - L'ID du cours.
  • cours - Contient des informations sur les cours :
    • id - L'ID du cours.
    • nom - Le nom du cours.
    • professeur_id - L'ID de l'enseignant pour ce cours.

Nous utiliserons la table professeur plus tard dans le cours, dans des requêtes plus avancées. Je l'expliquerai à ce moment-là. En attendant, jetez un coup d'œil à l'exemple des données de ces trois tables :

etudiant

idprenomnom_de_famille
1ShreyaBain
2RiannaFoster
3YosefNaylor

etudiant_cours

etudiant_idcours_id
12
13
21
22
23
31

cours

idnomprofesseur_id
1Conception BDD1
2Litterature anglaise2
3Programmation Python1

Tables de jointure

Il est important de noter que la table etudiant_cours est une table de jointure. Le seul but de cette table est de connecter les tables etudiant et cours ensemble.

Par exemple, " Shreya Bain " (l'étudiant avec id = 1) est relié à "Litterature anglaise" (le cours avec id = 2) et "Programmation Python" (le cours avec id = 3). Comment le savons-nous ? Regardez les deux premières lignes de la table. etudiant_cours. La première ligne indique que l'étudiant dont l'ID est égal à 1 (colonneetudiant_id ) est connecté à un cours dont l'ID est égal à 2 (colonnecours_id ). La deuxième ligne indique que l'étudiant dont l'ID est égal à 1 est connecté au cours dont l'ID est égal à 3. Ensuite, en regardant la table etudiant, nous pouvons lire que Shrek est l'étudiant dont l'ID est égal à 3, que Shreya Bain a un ID égal à 1. Enfin, en regardant la table cours, nous pouvons lire que la littérature anglaise et la programmation Python ont un ID respectivement égal à 2 et 3.

La relation entre les tables etudiant et cours s'appelle une relation plusieurs-à-plusieurs. Un étudiant peut suivre plusieurs cours (c'est-à-dire que plusieurs lignes avec le même etudiant_id peuvent se trouver dans la table etudiant_cours) et un cours peut être suivi par de nombreux étudiants (c'est-à-dire que de nombreuses lignes de la table etudiant_cours peuvent avoir le même cours_id).

Nous avons déjà vu l'utilisation de la table de jointure. Regardez à nouveau le code :

SELECT
  etudiant.prenom,
  etudiant.nom_de_famille,
  cours.nom
FROM etudiant
JOIN etudiant_cours
  ON etudiant.id = etudiant_cours.etudiant_id
JOIN cours
  ON cours.id = etudiant_cours.cours_id;

Comme vous pouvez le constater, nous utilisons la table etudiant dans la clause FROM. Ensuite, nous la joignons à la table etudiant_cours et, enfin, avec la table cours. De cette façon, nous pouvons afficher le nom et le prénom de chaque étudiant ainsi que les cours qu'il suit. Le code est toujours confus ? N'ayez crainte, nous allons l'expliquer en détail dans la section suivante.

Le résultat de cette requête ressemblera à ceci :

prenomnom_de_famillenom
ShreyaBainLitterature anglaise
ShreyaBainProgrammation Python
RiannaFosterConception BDD
RiannaFosterLitterature anglaise
RiannaFosterProgrammation Python
YosefNaylorConception BDD

Si vous voulez écrire vos propres requêtes qui joignent plusieurs tables, vous devez comprendre parfaitement ce qui se passe dans cette requête. Décomposons notre requête en plusieurs étapes.

Joindre 3 tables à l'aide d'une table de jointure

Première étape

La première étape consiste à examiner le schéma et à sélectionner les colonnes que nous voulons afficher. Comme nous voulons afficher les étudiants avec leurs cours, nous avons besoin de trois colonnes : etudiant.prenom, etudiant.nom_de_famille, et cours.nom.

Il est important d'utiliser les noms des tables pour lister vos colonnes. Ainsi, vous ne vous perdrez pas dans les différents noms de colonnes et vous saurez immédiatement la table à laquelle appartient la colonne.

À ce stade, notre requête devrait ressembler à ceci :

SELECT
  etudiant.prenom,
  etudiant.nom_de_famille,
  cours.nom

Étape 2

L'étape suivante consiste à déterminer quelles tables seront nécessaires pour la requête. Il y a deux tables évidentes : etudiant et cours. Cependant, nous devrons trouver un moyen de joindre ces tables. En regardant le schéma de la base de données, nous voyons qu'etudiant_cours est une table de jointure entre ces deux tables. Nous aurons donc également besoin de cette table.

Étape 3

Dans la dernière partie, nous devrons joindre toutes les tables ensemble. La première tâche consiste à choisir la table qui sera utilisée dans la clause FROM. En théorie, il peut s'agir de n'importe laquelle des tables que nous utilisons. Personnellement, j'aime bien commencer par une table qui n'est pas une table de jointure. Dans ce cas, nous choisissons la table etudiant.

SELECT
  etudiant.prenom,
  etudiant.nom_de_famille,
  cours.nom
FROM etudiant

Nous ne pouvons pas joindre la table cours pour l'instant. Il n'y a pas de connexion directe entre ces deux tables. Pour cette raison, nous devrons choisir la table etudiant_cours. Nous devons simplement connecter ces deux tables ensemble en utilisant l'instruction JOIN … ON …. Notre code prend forme :

SELECT
  etudiant.prenom,
  etudiant.nom_de_famille,
  cours.nom
FROM etudiant
JOIN etudiant_cours
  ON etudiant.id = etudiant_cours.etudiant_id

Avant de passer à l'ajout de la dernière table, nous devons réfléchir à ce que nous avons déjà réalisé. Notez que lorsque nous écrivons une clause JOIN, nous ne sommes pas limités aux colonnes de la clause SELECT - nous avons accès à toutes les colonnes ! Ainsi, notre requête ressemble à ceci :

SELECT
  etudiant.prenom,
  etudiant.nom_de_famille,
  etudiant.id,
  etudiant_cours.etudiant_id,
  etudiant_cours.cours_id
FROM etudiant
JOIN etudiant_cours
  ON etudiant.id = etudiant_cours.etudiant_id;

Cette requête montre presque toutes les colonnes que nous pouvons utiliser pour écrire la prochaine déclaration JOIN. (J'ai supprimé la colonne etudiant_cours.id, car nous n'en aurons pas besoin.) Regardez les données avec lesquelles nous travaillons :

prenomnom_de_familleidetudiant_idcours_id
ShreyaBain112
ShreyaBain113
RiannaFoster221
RiannaFoster222
RiannaFoster223
YosefNaylor331

Voici à quoi ressemblent nos données à mi-parcours. Il est souvent bon de réfléchir aux données à ce stade. Vous pouvez parfois envisager d'écrire une telle requête de temps en temps, juste pour analyser les lignes et les colonnes.

Le résultat ci-dessus devrait clairement montrer ce qu'il faut faire ensuite. Nous avons des étudiants connectés avec les ID des cours qu'ils suivent. La seule chose que nous devons ajouter est l'information sur le cours. Nous savons que la colonne cours_id se trouve dans la table etudiant_cours dans la table. Nous devons la joindre à la colonne id de la table. cours. La requête qui en résulte ressemble à ceci :

SELECT
  etudiant.prenom,
  etudiant.nom_de_famille,
  cours.nom
FROM etudiant
JOIN etudiant_cours
  ON etudiant.id = etudiant_cours.etudiant_id
JOIN cours
  ON cours.id = etudiant_cours.cours_id;

Et voilà le travail ! C'est la requête que nous voulions écrire. N'oubliez pas le point-virgule à la fin de votre code.

Dans cet exemple, nous avons analysé la façon d'écrire une requête avec des équi jointures - nous utilisons l'égalité dans nos conditions de jonction. Il s'agit du type de jointure le plus courant. Cependant, vous pouvez également utiliser des non-équi jointures. Si vous ne connaissez pas ce terme, je vous recommande de consulter An Illustrated Guide to the SQL Non-Equi Join sur le blog LearnSQL.fr .

Joindre des tables SQL sans table de jonction

Lorsque vous joignez plus de deux tables, vous ne disposez pas toujours d'une table de jonction. Mais avant d'analyser une requête d'exemple pour cette technique, vérifions la dernière table de notre schéma.

  • professeur - Contient des informations sur les enseignants :
    • id - L'ID de l'enseignant.
    • prenom - Le prénom de l'enseignant.
    • nom_de_famille - Le nom de famille du professeur.

Et voici à quoi ressemble la table professeur :

idprenomnom_de_famille
1TaylahBooker
2Sarah-LouiseBlake

Maintenant, étant donné les données, nous aimerions montrer chaque professeur avec ses étudiants. Chaque paire professeur-étudiant ne doit être affichée qu'une seule fois (par exemple, si un professeur a plus d'un cours avec un étudiant, le professeur ne doit être affiché qu'une seule fois avec l'étudiant dans le résultat).

Cette requête est assez similaire à la précédente. Par conséquent, nous allons suivre les mêmes étapes que précédemment.

Étape 1

D'abord, nous sélectionnons les colonnes : professeur.prenom, professeur.nom_de_famille, etudiant.prenom, et etudiant.nom_de_famille. Ensuite, nous choisissons les tables nécessaires. Cette fois, il s'agit de toutes les tables de notre schéma : etudiant, etudiant_cours, cours, et professeur.

Étape 2

Maintenant, nous devons joindre toutes les tables. Comme je l'ai déjà dit, nous pouvons commencer par n'importe quelle table, mais je préfère commencer par l'un des côtés. La dernière fois, nous avons mis la table etudiant dans la clause FROM. Cette fois-ci, nous allons utiliser la table professeur. Avant d'écrire les JOINs, notre requête ressemblera à la requête ci-dessous. (Notez le mot-clé DISTINCT; puisque nous voulons montrer des paires distinctes de professeur-étudiant, le mot-clé est extrêmement important).

SELECT DISTINCT
  professeur.prenom,
  professeur.nom_de_famille.
  etudiant.prenom,
  etudiant.nom_de_famille
FROM professeur

Étape 3

Maintenant, la jonction des tables n'est pas très différente de l'exemple précédent. Nous devons simplement utiliser la clause JOIN une fois de plus. Toutefois, avant de le faire, examinons les données après avoir joint les tables professeur et cours :

SELECT
  professeur.prenom,
  professeur.nom_de_famille,
  professeur.id,
  cours.professeur_id,
  cours.nom,
  cours.id
FROM professeur
JOIN cours
  ON professeur.id = cours.professeur_id;
prenomnom_de_familleidprofesseur_idnomid
TaylahBooker11Conception BDD1
TaylahBooker11Programmation Python3
Sarah-LouiseBlake22Litterature anglaise2

Vous pouvez les considérer comme une seule table. En fait, il s'agit un peu d'une version étendue de la table cours.

La jointure de deux tables supplémentaires est presque identique au processus que nous avons utilisé précédemment. Il suffit d'ajouter les deux mêmes JOINs que précédemment. Vous devez simplement garder à l'esprit que les JOINs doivent être écrits dans le bon ordre. Lors de la jointure, vous ne pouvez pas utiliser de colonnes provenant de tables qui n'ont pas encore été introduites.

SELECT DISTINCT
  professeur.prenom,
  professeur.nom_de_famille.
  etudiant.prenom,
  etudiant.nom_de_famille
FROM professeur
JOIN cours
  ON professeur.id = cours.professeur_id
JOIN etudiant_cours
  ON etudiant.id = etudiant_cours.etudiant_id
JOIN etudiant
  ON etudiant_cours.cours_id = cours.id;
JOIN etudiant_cours
  ON cours.id = etudiant_cours.etudiant_id
JOIN etudiant
  ON etudiant_cours.cours_id = etudiant.id;

Dans la partie barrée, j'ai copié du code de la première requête où nous avons joint trois tables. Dans ce cas, le code était erroné ; même si les conditions étaient correctes, nous utilisions des tables qui n'avaient pas encore été introduites. Par exemple, en joignant la table etudiant_cours nous avons utilisé la table etudiant qui a été introduite plus tard.

Sous le code barré, vous pouvez voir l'ordre correct de JOIN. Nous joignons les tables etudiant_cours et cours en premier. Ensuite, en utilisant la table etudiant_cours nous pouvons joindre la table etudiant . De cette façon, nous présentons chaque table avant de l'utiliser dans une condition JOIN … ON. N'oubliez jamais cette règle importante !

Le résultat de la requête ci-dessus ressemblera à ceci :

prenomnom_de_familleprenomnom_de_famille
TaylahBookerShreyaBain
TaylahBookerRiannaFoster
TaylahBookerYosefNaylor
Sarah-LouiseBlakeShreyaBain
Sarah-LouiseBlakeRiannaFoster

Dans ce cas, nous avons utilisé un INNER JOIN. Cela signifie que si le professeur n'a pas d'étudiants, il n'apparaîtra pas dans les résultats. Bien entendu, vous pouvez remplacer le INNER JOIN par tout autre type de JOIN, par exemple LEFT OUTER JOIN. Si vous souhaitez en savoir plus sur LEFT JOIN, consultez la rubrique Comment joindre plusieurs tables par LEFT JOIN en SQL sur LearnSQL.fr.

Les bases sont essentielles pour les jointures à 3 voies

Comme vous pouvez le constater, joindre trois tables en SQL n'est pas aussi difficile qu'il n'y paraît. En fait, vous pouvez joindre autant de tables que vous le souhaitez - l'idée sous-jacente est la même que celle de joindre seulement deux tables.

Il est très utile de jeter un coup d'œil aux données à mi-parcours et d'imaginer que les tables que vous avez déjà jointes ne forment qu'une seule table.

Pour réussir à utiliser les JOINs complexes, il est important de bien comprendre les JOINs de base. Une bonne connaissance de ces derniers vous permettra d'écrire des instructions JOIN extrêmement complexes. Et n'oubliez pas : c'est en forgeant qu'on devient forgeron. Si vous avez besoin de plus d'explications ou d'exercices sur JOINs en SQL, jetez un coup d'œil au cours Les jointures en SQL à l'adresse suivante LearnSQL.fr.