Retour à la liste des articles Articles
8 minutes de lecture

INNER JOIN vs. OUTER JOIN : Quelle est la différence ?

Décider quand utiliser INNER JOIN ou OUTER JOIN est souvent un défi pour les débutants. Dans cet article, vous trouverez des explications et des exemples qui vous aideront à mieux comprendre la différence entre ces deux jointures.

En SQL, JOINs vous permet de combiner des données provenant de différentes tables ; INNER JOIN et OUTER JOIN sont simplement des types d'instructions JOIN. Il est essentiel de comprendre leurs différences si vous travaillez avec des bases de données relationnelles. Elle est également cruciale si vous passez un entretien d'embauche en SQL : la différence entre INNER JOIN et OUTER JOIN fait partie des questions les plus fréquemment posées lors d'un entretien d'embauche en SQL.

Pour réviser vos connaissances sur JOINs, je vous recommande notre cours interactif Les jointures en SQL. Vous y trouverez 93 exercices pratiques couvrant tous les cas d'utilisation de INNER JOIN par rapport à OUTER JOIN. En outre, vous apprendrez à filtrer correctement les données avec les différentes variantes de JOIN et à combiner des tables avec des colonnes non clés.

Qu'est-ce qu'un JOIN en SQL ?

Commençons par examiner une base SQL JOIN.

Imaginons que vous disposiez d'une base de données universitaire avec les tables student et lecturer. Dans la table student nous avons le champ optionnel advisor_id qui stocke l'ID du professeur qui est le conseiller de thèse de l'étudiant. Un étudiant peut ne pas avoir de conseiller s'il n'a pas encore rédigé sa thèse.

Pour afficher les noms des étudiants et de leurs conseillers, nous utilisons l'instruction JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

Les données résultantes pourraient ressembler à ceci :

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez

L'instruction JOIN vient après la clause FROM: vous placez le nom de la première table après FROM, puis le mot-clé JOIN, puis le nom de l'autre table, suivi du mot-clé ON et de la condition JOIN. Dans notre cas, la condition JOIN est student.advisor_id = lecturer.id.

Cette requête renvoie les lignes où le advisor_id de la table student correspond à id dans la table lecturer table. En fait, elle renvoie les noms des étudiants ainsi que les noms de leurs conseillers.

Pour toute référence ultérieure sur tous les types de JOIN, nous vous recommandons de mettre en signet ou d'imprimer notre fiche d'aide sur les JOIN SQL.

Qu'est-ce qu'une JOIN INNER ?

Lorsque vous utilisez le mot-clé JOIN en SQL, vous effectuez en fait une recherche sur INNER JOIN. Une recherche sur INNER JOIN renvoie toutes les combinaisons de lignes des deux tables qui satisfont à la condition ON. Dans notre exemple, il renvoie les noms des étudiants et de leurs conseillers.

Cependant, un INNER JOIN n'est pas suffisant si vous souhaitez inclure des lignes qui n'ont pas de correspondance dans l'autre table. Par exemple, vous pouvez vouloir afficher les noms de tous les étudiants, même ceux qui n'ont pas encore de conseiller. Ou bien vous voulez inclure les noms de tous les professeurs, même ceux qui ne conseillent aucun étudiant. C'est là que OUTER JOIN entre en jeu.

Qu'est-ce qu'un OUTER JOIN ?

Un OUTER JOIN est le type de JOIN qui renvoie les lignes correspondantes des deux tables plus toutes les lignes non correspondantes de l'une des tables (ou parfois des deux). OUTER JOIN a trois variantes : LEFT OUTER JOIN, RIGHT OUTER JOIN, et FULL OUTER JOIN. Examinons chacune d'entre elles.

JOINTURE EXTERNE GAUCHE

LEFT OUTER JOIN (ou simplement LEFT JOIN) renvoie toutes les lignes de la table de gauche (la table à gauche de l'instruction JOIN, c'est-à-dire immédiatement après FROM) avec les données correspondantes de la table de droite (la table à droite de (c'est-à-dire immédiatement après) l'instruction JOIN ). S'il n'y a pas de correspondance, les colonnes provenant du tableau de droite sont remplies avec NULL.

En utilisant les commandes student et lecturer nous pouvons utiliser LEFT JOIN pour obtenir une liste de tous les étudiants avec les données de leur conseiller. Nous voulons inclure tous les étudiants, même ceux qui n'ont pas encore de conseiller. La requête ressemblerait à ceci :

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

Les résultats sont les suivants :

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL

Dans les résultats, nous pouvons voir une ligne qui n'a pas été incluse précédemment. L'étudiante Diana Prince n'a pas de conseiller, elle n'a donc pas été incluse dans le résultat de la requête INNER JOIN. Cependant, avec une requête LEFT JOIN, elle est incluse. LEFT JOIN inclut toutes les lignes du tableau de gauche, même celles qui n'ont pas de ligne correspondante dans le tableau de droite. Les colonnes provenant du tableau lecturer sont affichées sous la forme NULL.

Lisez cet article sur les JOINTS EXTERNES GAUCHES en SQL si vous avez besoin de plus d'informations.

JOINTURE EXTERNE DROITE

RIGHT OUTER JOIN (ou simplement RIGHT JOIN) renvoie toutes les lignes de la table de droite (la deuxième table) avec les données correspondantes de la table de gauche (la première table). S'il n'y a pas de correspondance, les colonnes provenant de la table de gauche sont remplies de zéros.

Supposons que nous souhaitions dresser la liste des professeurs avec les données relatives aux étudiants qu'ils conseillent. Nous voulons inclure tous les professeurs, même ceux qui ne conseillent aucun étudiant. Nous écrirons donc une requête comme celle-ci :

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS lecturer_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

Le résultat de cette requête est le suivant :

student_namelecturer_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

L'utilisation de RIGHT JOIN dans la requête nous permet d'obtenir une liste de tous les chargés de cours, qu'ils soient affectés à des étudiants ou non. Si un enseignant est affecté à un étudiant, il est listé avec le nom de l'étudiant. Si un enseignant n'est associé à aucun étudiant, les données relatives aux étudiants dans l'ensemble de résultats sont NULL.

Consultez ce guide complet sur les jointures SQL pour obtenir toutes les ressources dont vous avez besoin pour bien comprendre ce sujet.

JOINTURE EXTERNE COMPLÈTE

FULL OUTER JOIN (ou simplement FULL JOIN) nous permet d'obtenir toutes les données des deux tables, qu'il y ait ou non une correspondance entre leurs lignes. Dans notre exemple, l'utilisation de FULL JOIN entre student et lecturer permet d'obtenir tous les étudiants et tous les professeurs. La requête ressemblerait à ceci :

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
FULL JOIN lecturer
ON student.advisor_id = lecturer.id;

Et les résultats seraient les suivants :

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

Dans le résultat, vous pouvez voir tous les étudiants et tous les professeurs. Si un étudiant n'a pas de conseiller, les données relatives au conseiller sont NULL. Si un enseignant n'est affecté à aucun étudiant, les données relatives à l'étudiant correspondant sont NULL.

Trouvez d'autres exemples et mettez vos connaissances à l'épreuve avec ces 12 questions d'entraînement SQL JOIN.

Certains systèmes de gestion de bases de données relationnelles (SGBDR), tels que MySQL et MariaDB, ne prennent pas en charge FULL JOIN. Vous pouvez obtenir le même résultat dans ces SGBD, mais la requête est un peu plus longue.

La façon de créer un FULL JOIN dans les versions de SQL qui ne supportent pas cette commande est d'utiliser UNION entre le INNER JOIN, le LEFT JOIN et le RIGHT JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id

UNION
SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

Dans le script ci-dessus, l'union des trois formes de JOIN - LEFT JOIN, INNER JOIN et RIGHT JOIN - produit les mêmes données que le FULL JOIN dans les SGBDR qui le supportent.

Lorsque vous aurez acquis la maîtrise de Les jointures en SQL, lisez ces questions et réponses d'entretien SQL JOIN pour vérifier si vous êtes prêt pour un entretien d'embauche.

Résumé de INNER JOIN vs OUTER JOIN

Nous pouvons synthétiser ce que nous avons appris sur INNER JOIN et OUTER JOIN dans le tableau suivant :

 

INNER JOIN

OUTER JOIN

Explication

Renvoie les lignes des deux tables où la condition ON est satisfaite

Renvoie les lignes des deux tables où la condition ON est satisfaite ET également les enregistrements sans correspondance d'une ou des deux tables, en les remplissant avec des valeurs nulles là où aucune correspondance n'existe.

Types

1 type: JOIN

3 types différents: LEFT JOIN, RIGHT JOIN, FULL JOIN

Abréviation

JOIN = INNER JOIN

LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
FULL JOIN = FULL OUTER JOIN

Exemple

SELECT
  student.full_name,
  lecturer.full_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

SELECT

  student.full_name,
  lecturer.full_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

Pour plus de détails, consultez cette liste de sept exemples de JOIN SQL accompagnés d'explications.

Où en savoir plus sur les JOIN INNER et OUTER

Maintenant que vous connaissez les différences entre INNER JOIN et OUTER JOIN, vous pouvez écrire des requêtes précises qui génèrent des informations fiables et exactes. Avec de l'entraînement, vous serez en mesure de répondre à n'importe quelle question d'entretien SQL sur les différences entre INNER JOIN et OUTER JOIN.

Avant d'aller plus loin, je vous recommande notre cours Les jointures en SQL si vous souhaitez approfondir vos connaissances. À la fin du cours, vous connaîtrez les différentes façons d'obtenir des données combinées à partir de plusieurs tables. Et vous saurez comment choisir la meilleure option pour chaque scénario.

Maintenant, c'est à vous de commencer à vous informer sur les différences entre INNER JOIN et OUTER JOIN. Bon apprentissage !