Retour à la liste des articles Articles
12 minutes de lecture

Qu'est-ce que le FULL JOIN en SQL ? Une explication avec 4 exemples

Qu'est-ce que le FULL JOIN - l'un des types de jointures SQL les plus négligés ? Dans cet article, nous allons vous montrer à quel point FULL JOIN peut être utile et vous apprendre à l'appliquer à différents scénarios. Les quatre exemples couvrent quelques-unes des utilisations typiques.

Une jointure SQL est une construction permettant de combiner des données provenant de deux tables ou plus. Le FULL JOIN est l'un des types de jointures. Vous tirerez le meilleur parti de cet article si vous êtes déjà familiarisé avec les jointures SQL et leur fonctionnement. Si ce n'est pas le cas ou si vos connaissances ont besoin d'être rafraîchies, nous vous recommandons de suivre notre cours interactif Les jointures en SQL pour combler vos lacunes. Quatre-vingt-treize exercices vous y attendent, dans lesquels vous récapitulerez les types de jointures et vous vous exercerez à filtrer des données à l'aide de jointures simples et multiples, d'auto-joints et de jointures non égales.

Qu'est-ce qu'une jointure complète ?

FULL JOIN ou FULL OUTER JOIN (SQL accepte les deux) est une jointure externe. En SQL, une jointure externe est un type de jointure qui inclut les lignes non appariées d'une ou des deux tables jointes ; LEFT JOIN et RIGHT JOIN sont également des jointures externes. FULL JOIN est l'union de LEFT JOIN et RIGHT JOIN: il montre les lignes correspondantes et non correspondantes des deux tables. Lorsque les valeurs d'une table ne correspondent pas à celles de l'autre table, FULL JOIN renvoie NULLs. Visuellement, cela peut être représenté comme suit :

FULL JOIN en SQL

Syntaxe du FULL JOIN

La syntaxe de FULL JOIN est la suivante :

SELECT …
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

Comme pour les jointures SQL, les parties principales de la syntaxe FULL JOIN sont les clauses JOIN et ON. La première table de la clause FROM est suivie du mot-clé FULL JOIN, qui joint la deuxième table. La condition sur laquelle les tables sont jointes est spécifiée dans la clause ON. En général, les tables sont jointes sur une colonne partagée entre elles - par exemple, la colonne id dans la table writer et la colonne writer_ID de la table book dans la table. Ces deux colonnes ont les mêmes valeurs en raison de la relation clé primaire - clé étrangère.

Dans un exemple simple, nous pourrions écrire ce code et obtenir le résultat suivant :

Autres types de jointures en SQL

Nous avons déjà mentionné que FULL JOIN n'est qu'un des nombreux types de jointures en SQL. En voici la liste complète :

  • (INNER) JOIN
  • LEFT (OUTER) JOIN
  • RIGHT (OUTER) JOIN
  • FULL (OUTER) JOIN
  • CROSS JOIN

JOIN (ou INNER JOIN) est un type de jointure interne qui renvoie uniquement les lignes correspondantes des tables jointes. Pour en savoir plus sur la jointure interne, cliquez ici.

LEFT JOIN (ou LEFT OUTER JOIN) répertorie toutes les lignes de la première table (gauche) et uniquement les lignes correspondantes de la deuxième table (droite). S'il n'y a pas de lignes correspondantes dans le tableau de droite, les valeurs sont affichées sous la forme NULL. Pour en savoir plus, consultez notre article sur le LEFT JOIN.

RIGHT JOIN (ou RIGHT OUTER JOIN) est l'image miroir de LEFT JOIN. Il renvoie toutes les lignes de la deuxième table (droite) et uniquement les lignes correspondantes de la première table (gauche). Lorsqu'il y a des lignes non correspondantes dans le tableau de gauche, les valeurs sont NULL.

Vous comprenez mieux maintenant pourquoi nous avons dit que FULL JOIN est l'union de LEFT JOIN et RIGHT JOIN. Comme il montre toutes les données des tables de gauche et de droite ainsi que les lignes non correspondantes, c'est comme si vous utilisiez LEFT JOIN et RIGHT JOIN en même temps.

CROSS JOIN renvoie un produit cartésien. En d'autres termes, il renvoie toutes les combinaisons de toutes les lignes des deux tables jointes.

Exemples de FULL JOIN

Passons maintenant aux exemples qui illustrent l'utilisation typique de FULL JOIN.

Exemple 1 : Afficher tous les employés et départements de la société

Tâche : Vous devez afficher tous les employés d'une entreprise, même s'ils n'ont pas de département assigné. Vous devez également afficher tous les départements, même si aucun employé n'y est affecté.

Ensemble de données : Nous utiliserons deux tables pour résoudre le problème. La première table est celle des départements (le script est ici), qui contient la liste des départements de l'entreprise :

iddepartment_name
1IT
2Accounting
3Sales

La seconde table est celle des employés, dont les données sont présentées ci-dessous. Le script est ici:

idfirst_namelast_namedepartment_id
1SarahZimmerman2
2ThomasTyson1
3DanielRichardson1
4SofiaTardelli2
5MarkFitzpatrick4

Solution :

SELECT 
  first_name,
  last_name,
  department_name
FROM employees e
FULL JOIN department d
  ON e.department_id = d.id;

Explication : Le code sélectionne le nom et le prénom des employés ainsi que le nom du service.

Nous pouvons le faire parce que nous FULL JOIN les deux tables. Nous référençons la table employees dans FROM et lui donnons un alias. Ensuite, nous référençons la deuxième table, departmentdans FULL JOIN. Les tables sont jointes sur la base des identifiants de département trouvés dans les deux tables. Cette condition de jointure est écrite dans la clause ON.

Résultat : La sortie renvoie toutes les données des deux tables. Certaines lignes intéressantes méritent d'être développées.

Mark Fitzpatrick n'a pas de département. department_id est 5, mais il n'y a pas de département avec l'ID 5 dans la table. department. Il y a donc une valeur NULL sous le nom du département. Cela peut être dû au fait qu'il s'agit d'un nouvel employé et que la table n'a pas été mise à jour avec le département. employees n'a pas été mise à jour avec les données du département.

De même, la dernière ligne indique le département Ventes, mais pas le nom de l'employé. Cela indique que le service des ventes n'a pas d'employés. Il n'y a rien d'anormal à cela, puisque nous avons appris que les trois employés du service des ventes ont récemment quitté l'entreprise.

first_namelast_namedepartment_name
SarahZimmermanAccounting
ThomasTysonIT
DanielRichardsonIT
SofiaTardelliAccounting
MarkFitzpatrickNULL
NULLNULLSales

Exemple 2 : Afficher tous les clients avec le nombre de produits achetés et le nombre de produits sans ventes

Tâche : Il existe un magasin de disques en ligne qui vend des vinyles (c'est-à-dire des disques de musique). Votre tâche consiste à dresser la liste de tous les clients et à déterminer le nombre de vinyles achetés par chacun d'entre eux. Le résultat doit également indiquer le nombre de vinyles que personne n'a encore achetés.

Ensemble de données : Nous travaillerons avec trois tableaux. La première est customeravec le script ici:

idfirst_namelast_name
1MarvinSimmons
2MarianneDickens
3SusanStrozzi

Vous pouvez trouver le script pour la deuxième table, vinyl, ici. La table montre la liste des vinyles, comme vous pouvez le voir ci-dessous :

idartistalbum_nameprice
1Callier, TerryWhat Color is Love24.99
2Guy, BuddySweet Tea32.99
3Little SimzA Curious Tale of Trials32.99
4LaVette, BettyeScene of the Crime36.99

La troisième table est une table de jonction nommée purchase. Vous trouverez le script ici:

idcustomer_idvinyl_idpurchase_date
1122023-01-03
2132023-01-12
3122023-02-18
4132023-03-01
5232023-03-01
6222023-04-01
7242023-05-01

Solution :

SELECT 
  first_name,
  last_name,
  COUNT (v.id) AS vinyl_count	   
FROM customer c
FULL JOIN purchase p
  ON c.id = p.customer_id
FULL JOIN vinyl v
  ON p.vinyl_id = v.id
GROUP BY first_name, last_name;

Explication : Il s'agit d'un exemple d'utilisation de FULL JOIN et de jonction de plus de deux tables.

La requête sélectionne les noms des clients. Ensuite, elle utilise la fonction d'agrégation COUNT() pour trouver le nombre de vinyles achetés. Nous FULL JOIN la table customer avec la table purchase table. Cette opération est effectuée sur les identifiants des clients dans les deux tables.

Nous devons maintenant joindre la troisième table. C'est simple : écrivez à nouveau FULL JOIN et faites référence à la table vinyl. Vous pouvez maintenant la joindre à la table purchase sur les ID de vinyles.

Résultat : La sortie montre qu'il y a un vinyle que personne n'a encore commandé. Vous pouvez le reconnaître grâce aux NULL.

Il y a également une liste de tous les clients et le nombre de vinyles qu'ils ont achetés. Susan Strozzi n'a rien acheté. Marianne Dickens et Marvin Simmons ont acheté respectivement trois et quatre vinyles.

first_namelast_namevinyl_count
NULLNULL1
SusanStrozzi0
MarianneDickens3
MarvinSimmons4

Exemple 3 : Liste de toutes les paires d'étudiants certifiés et de leurs notes

Tâche : Vous travaillez pour une plateforme de certification SQL en ligne. Elle propose plusieurs certifications ; chaque année, il y a une nouvelle édition de chaque certification. Trouvez toutes les paires possibles étudiant-certification et la note obtenue par chaque étudiant dans toutes les éditions de la certification.

Ensemble de données : L'ensemble de données augmente ; il comprend désormais quatre tables. La première table est student; voici le script. Il s'agit d'une liste des étudiants de la plateforme :

nos vinyles, respectivement.

idfirst_namelast_name
1TomFrank
2MaryMaddison
3PavelKuba
4AmandaWilson

La deuxième table est la table des certificats, qui contient la liste des certificats. Voici le script :

idcertificate_name
1Microsoft Certified: Azure Data Fundamentals
2Oracle Database SQL Certified Associate Certification
3IBM Certified Database Associate
4MySQL 5.7 Database Administrator Certification
5EDB PostgreSQL 12 Associate Certification

La table suivante est une table de jonction appelée certificate_enrollment

idstudent_idedition_idgradepass
121620FALSE
226850TRUE
3210900TRUE
412100FALSE
517500FALSE
617800TRUE
748800TRUE
. Vous trouverez le script ici. Le tableau indique quels étudiants se sont inscrits à quel certificat, ainsi que leurs notes et s'ils ont réussi :

Le dernier tableau est une table de jonction appelée certificate_edition. Il présente la liste des éditions de certificats, en lien avec le tableau certificate. Le script est ici:

idcertificate_idedition
112022
222022
332022
442022
552022
612023
722023
832023
942023
1052023

Solution :

SELECT 
  first_name,
  last_name,
  certificate_name,
  edition,
  grade
FROM student s
FULL JOIN certificate_enrollment cen
  ON s.id = cen.student_id
FULL JOIN certificate_edition ced
  ON cen.edition_id = ced.id
FULL JOIN certificate c
  ON ced.certificate_id = c.id;

Explication : Nous sélectionnons d'abord toutes les colonnes pertinentes des quatre tables : first_name et last_name from student, certificate_name de certificate, edition à partir de certificate_edition, et grade à partir de certificate_enrollment.

Ensuite, nous joignons les tables comme dans les exemples précédents. Tout d'abord, il s'agit de la student table FULL JOINed avec certificate_enrollment sur les identifiants des étudiants.

Le second FULL JOIN ajoute la table certificate_edition pour la joindre à la table certificate_enrollment. Les tables sont jointes sur l'ID de l'édition du certificat.

Maintenant que nous avons joint trois tables, nous pouvons en ajouter une quatrième. Nous référençons la table certificate dans FULL JOIN. Nous la joignons à certificate_edition sur l'ID du certificat.

Résultat : La sortie montre exactement ce que nous voulons.

Il y a une liste de tous les étudiants qui ont reçu un certificat, son édition et la note obtenue par chaque étudiant. Si la note est inférieure à 700, l'étudiant a échoué et doit repasser l'examen.

Un étudiant ne s'est pas encore inscrit à un programme de certificat ; il s'agit de Pavel Kuba. Par ailleurs, quatre éditions du certificat n'ont pas encore d'étudiants inscrits.

first_namelast_namecertificate_nameeditiongrade
MaryMaddisonMicrosoft Certified: Azure Data Fundamentals2022620
MaryMaddisonMicrosoft Certified: Azure Data Fundamentals2023850
MaryMaddisonEDB PostgreSQL 12 Associate Certification2023900
TomFrankOracle Database SQL Certified Associate Certification2022100
TomFrankOracle Database SQL Certified Associate Certification2023500
TomFrankOracle Database SQL Certified Associate Certification2023800
AmandaWilsonIBM Certified Database Associate2023800
PavelKubaNULLNULLNULL
NULLNULLEDB PostgreSQL 12 Associate Certification2022NULL
NULLNULLMySQL 5.7 Database Administrator Certification2022NULL
NULLNULLIBM Certified Database Associate2022NULL
NULLNULLMySQL 5.7 Database Administrator Certification2023NULL

Exemple 4 : Trouver toutes les paires auteur-sujet et afficher les articles et leur statut

Tâche : Vous travaillez pour une entreprise qui recrute des rédacteurs d'articles pour ses clients. Il existe une liste de rédacteurs et de sujets que vous proposez. De plus, chaque sujet a actuellement plusieurs articles disponibles. Les rédacteurs sont affectés à ces articles. Un article peut avoir l'un des deux statuts suivants : "Rédaction" (l'article est en cours de rédaction) ou "Révision" (l'article est en cours de révision).

Trouvez toutes les paires rédacteur-sujet. En outre, dressez la liste de tous les articles et de leur statut.

Ensemble de données : Cet ensemble de données se compose également de quatre tableaux. Le premier tableau est le suivant writeravec le script lié ici:

idfirst_namelast_name
1VictoriaThompson
2MikeMcGill
3SkyHerrera
4JimmyGoodman

Le tableau suivant est topic. Voici le script :

idtopic_name
1SQL
2Python
3ML
4SQL Careers
5Python Careers

Le troisième tableau est article_assignment. Il relie le rédacteur à l'article et indique l'état actuel de l'article. Voici le script :

idwriter_idarticle_idstatus
143Revising
241Writing
335Writing
438Revising
5310Revising
617Writing

Le quatrième tableau relie l'article au sujet. Il s'appelle articleet le script se trouve ici:

idarticle_titletopic_id
1What is FULL JOIN in SQL? An Explanation with 4 Examples1
2Pandas in Python2
3Supervised Learning3
4Basic SQL Interview Questions4
5Basic Python Interview Questions5
6SQL Fonctions de fenêtrage1
7Ranking Data in Python2
8Unsupervised Learning3
9Intermediate SQL Interview Questions4
10Intermediate Python Interview Questions5

Solution :

SELECT 
  first_name,
  last_name,
  topic_name,
  article_title,
  status
FROM writer w
FULL JOIN article_assignment aa
  ON w.id = aa.writer_id
FULL JOIN article a
  ON aa.article_id = a.id
FULL JOIN topic t
  ON a.topic_id = t.id;

Explication : La requête est similaire à la précédente. Elle sélectionne toutes les colonnes pertinentes - le nom de l'auteur, le sujet, le titre de l'article et son statut. Ensuite, elle joint les tables writer et article_assignment sur l'ID de l'auteur à l'aide de FULL OUTER JOIN.

Un autre FULL JOIN ajoute la troisième table article et la joint sur l'ID de l'article. Enfin, la quatrième table est reliée à l'identifiant du sujet.

Résultat : Voici une liste de tous les rédacteurs, des sujets, des articles et des statuts.

Les sujets de Jimmy Goodman sont ML et SQL. Sky Herrera écrit sur les carrières Python et la ML. Victoria Thompson n'écrit que sur Python.

Mike McGill n'a pas d'articles assignés. De plus, il y a un article sur Python, un sur SQL et deux sur SQL Career qui n'ont été assignés à aucun auteur.

first_namelast_nametopic_namearticle_titlestatus
JimmyGoodmanMLSupervised LearningRevising
JimmyGoodmanSQLWhat is FULL JOIN in SQL? An Explanation with 4 ExamplesWriting
SkyHerreraPython CareersBasic Python Interview QuestionsWriting
SkyHerreraMLUnsupervised LearningRevising
SkyHerreraPython CareersIntermediate Python Interview QuestionsRevising
VictoriaThompsonPythonRanking Data in PythonWriting
MikeMcGillNULLNULLNULL
NULLNULLPythonPandas in PythonNULL
NULLNULLSQLSQL Fonctions de fenêtrageNULL
NULLNULLSQL CareersBasic SQL Interview QuestionsNULL
NULLNULLSQL CareersIntermediate SQL Interview QuestionsNULL

Pas de FULL JOIN, pas de SQL Mastery

FULL JOIN La jointure complète n'est probablement pas utilisée aussi souvent que JOIN ou LEFT JOIN. Il s'agit d'une jointure humble qui attend que vous en ayez besoin pour briller de tous ses feux. Mais sans elle dans votre répertoire, vous ne pouvez pas vous qualifier de maître SQL.

Les exemples ci-dessus vous ont montré des scénarios pratiques dans lesquels vous devez utiliser toutes les données de deux tables (ou plus). FULL JOIN vous facilite la tâche !

Bien sûr, vous aurez besoin de plus de pratique, car la partie la plus cruciale de l'utilisation des jointures SQL est le choix de la jointure à utiliser. Une fois cette étape maîtrisée, les jointures deviennent faciles : la syntaxe est la même, quel que soit le type de jointure utilisé. Notre cours Les jointures en SQL peut vous aider à maîtriser JOINs, car il regorge d'exercices pratiques. Il en va de même pour notre article de pratique sur les jointures SQL avec 12 exemples. Après avoir appris tout cela, il ne sera pas difficile de répondre aux questions d'entretien sur les jointures SQL.

Maintenant, c'est à vous d'utiliser toutes ces ressources pour maîtriser FULL JOIN!