Retour à la liste des articles Articles
8 minutes de lecture

Qu'est-ce qu'un FULL JOIN et quand l'utiliser ?

Apprenez ce qu'est un FULL JOIN, comment le mettre en œuvre, comment il se compare aux autres types de Les jointures en SQL, et certains de ses cas d'utilisation uniques.

Avant d'aborder les FULL JOIN, rappelons rapidement ce qu'est une JOIN SQL. À la base, une JOIN combine les données de deux ou plusieurs tables dans une base de données. Les tables sont généralement liées entre elles à l'aide d'identifiants uniques dans chaque table, c'est-à-dire des clés primaires et étrangères.

Pour illustrer un simple SQL JOIN - également connu sous le nom de INNER JOIN - en action, considérons les requêtes Products et OrderDetails de la célèbre base de données exemple Northwind. La table Products contient une liste de tous les produits et la table OrderDetails contient une liste de toutes les commandes récentes.

PRODUCTS
ProductIDProductNameSupplierIDCategoryIDUnitPrice
1Chais1110 boxes x 20 bags18
2Chang1124 - 12 oz bottles19
3Aniseed Syrup1212 - 550 ml bottles10
..................

ORDERDETAILS
OrderDetaiIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
............

Voici la requête :

SELECT 
Products.ProductName, OrderDetails.OrderID, OrderDetails.Quantity
FROM Products
JOIN OrderDetails 
ON Products.ProductID=OrderDetails.ProductID
ORDER BY Quantity Desc;

Et le résultat :

ProductNameOrderIDQuantity
Pâté chinois10398120
Steeleye Stout10286100
Sirop d'érable1044090

L'exemple ci-dessus utilise ProductID (qui est disponible dans les deux tables) comme clé pour joindre les deux tables et afficher chaque commande triée par ordre décroissant par Quantity. Notez qu'un simple JOIN comme celui ci-dessus ne renvoie que les lignes correspondantes des deux tables. Dans ce cas, les résultats ne comprendront que les produits commandés récemment et les commandes liées à un ProductID valide.

FULL JOIN

FULL JOIN : une introduction

Contrairement à INNER JOIN, FULL JOIN renvoie toutes les lignes des deux tables jointes, qu'elles aient ou non une ligne correspondante. Par conséquent, FULL JOIN est également appelé FULL OUTER JOIN. Une FULL JOIN renvoie les lignes non correspondantes des deux tables ainsi que le chevauchement entre elles. Lorsqu'il n'existe pas de lignes correspondantes pour une ligne dans la table de gauche, les colonnes de la table de droite auront des NULL pour ces enregistrements. De même, si aucune ligne ne correspond à une ligne de la table de droite, les colonnes de la table de gauche auront des NULL.

Pour démontrer la différence entre un simple SQL JOIN et un FULL OUTER JOIN, considérons les tables Projects et Employees comme indiqué ci-dessous. La table Projects contient une liste de tous les projets entrepris par l'entreprise (projets internes et externalisés), tandis que la table Employees contient une liste de tous les employés actuels et précise s'ils sont impliqués dans des projets de l'entreprise.

PROJECTS
ProjectIDProjectNameCostYTDBusinessUnit
1CRM Upgrade45640Customer Relations
2Cybersecurity Protocol Implementation80200Cybersecurity
3HQ Office Renovations145000Facilities
4ERP Integration110000Corporate
5Database Stack Upgrade25000Engineering
............
15Automated QA10000Engineering

EMPLOYEES
EmployeeIDEmployeeNameProjectIDStartDateBusinessUnit
001Albert Ross32012-02-11Facilities
002Hummer BairdNULL2012-02-11Corporate
003Matthias Dias152012-07-15Engineering
004Al Cooper12014-04-15Customer Relations
005Macron RalfNULL2014-04-15Legal
...............
025Hamza ImranNULL2020-07-11Engineering

Si nous devions faire des JOINs entre ces deux tables en faisant correspondre les tables par le biais de ProjectID comme clé primaire, les résultats d'un simple INNER JOIN et d'un FULL OUTER JOIN seraient très différents. Un INNER JOIN produirait un tableau contenant uniquement les résultats pour lesquels il existe une correspondance entre les deux entrées correspondantes dans les deux tableaux. Le résultat de INNER JOIN contient les noms des employés et les noms des projets correspondants :

EmployeeNameProjectName
Albert RossHQ Office Renovations
Matthias DiasAutomated QA
Al CooperCRM Upgrade

En revanche, une FULL OUTER JOIN produira les données des deux tables, qu'il y ait ou non une correspondance dans l'autre table :

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

Le résultat de FULL JOIN contient tous les noms des employés, qu'ils soient ou non affectés à un projet, et tous les noms des projets, même si aucun employé n'est affecté à ce projet.

Syntaxe de la FULL JOIN

La syntaxe de base de FULL JOIN est similaire à celle des autres types de jointures :

SELECT 
	left_table.column1, right_table.column2,...
FROM left_table
FULL OUTER JOIN right_table 
ON left_table.key = right_table.key;

Le mot-clé OUTER est facultatif et peut être omis.

Exemple

Maintenant, reprenons l'exemple d'une FULL OUTER JOIN qui affiche à la fois EmployeeName et ProjectName. Voici la requête :

SELECT 
Employees.EmployeeName, Projects.ProjectName
FROM Employees
FULL OUTER JOIN Projects 
ON Employees.ProjectID=Projects.ProjectID
ORDER BY EmployeeID;

Et le résultat :

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

D'après le tableau des résultats, nous constatons que le site FULL JOIN produit également des résultats NULS à la fois dans les champs Projects et Employees même si aucune correspondance n'a été trouvée dans l'autre table. Les NULL dans la colonne ProjectName indiquent que l'employé n'est pas spécifiquement affecté à un projet et remplit probablement d'autres fonctions dans l'entreprise. D'autre part, un NULL dans la colonne EmployeeName suggère que le projet spécifique est probablement externalisé et n'est pas directement géré par un employé de l'entreprise. Par ailleurs, une valeur NULL peut également indiquer une erreur potentielle ou une suppression de données par inadvertance dans la base de données ou le système. (Nous en discuterons davantage ci-dessous).

Il est bon de noter que certaines bases de données, comme MySQL, ne supportent pas les jointures complètes. Dans ce cas, vous pouvez utiliser l'opérateur UNION ALL pour combiner LEFT JOIN et RIGHT JOIN.

Notre article précédent sur Les jointures en SQL contient quelques autres exemples que vous pouvez examiner. Notre cours Les jointures en SQL cours fournit également des exemples complets de FULL JOINs et comprend des exercices pratiques pour parfaire vos connaissances.

Cas d'utilisation de la FULL JOIN

Par rapport aux autres types de Les jointures en SQL, vous utiliserez probablement moins souvent FULL JOIN. Cela dit, c'est un outil très pratique pour quelques situations uniques. Voici quelques-uns de ses cas d'utilisation :

  • Pour récupérer tous les enregistrements des deux tables, qu'il y ait une correspondance ou non. C'est l'exemple que nous avons vu ci-dessus.
  • Pour trouver des données non concordantes ou orphelines dans les deux tables. Un enregistrement orphelin est un enregistrement dont la valeur de la clé étrangère fait référence à une valeur de clé primaire inexistante ; cela se produit souvent dans les systèmes à évolution rapide ou très anciens.
  • Pour exécuter des rapports d'exception. Il s'agit d'une forme d'analyse des données qui compare un ensemble de données à un ensemble de données de base souhaité/attendu et met en évidence les éléments qui ne correspondent pas.

Bien que l'application des FULL JOINs soit assez unique, ils constituent un excellent moyen de trouver et de diagnostiquer les problèmes potentiels d'intégrité des données.

Types de JOINs : Récapitulatif

Comme nous l'avons mentionné ci-dessus, il existe quelques autres types de jointures.

Une INNER JOIN renvoie des lignes lorsque la condition JOIN est satisfaite à la fois dans les tables de gauche et de droite. En d'autres termes, elle renvoie uniquement les enregistrements correspondants dans les tables. Il s'agit du type le plus courant de SQL JOIN et de la valeur par défaut lorsque vous n'avez pas spécifié le type de JOIN.

Le site OUTER JOIN renvoie toutes les lignes d'une table et certaines ou toutes les lignes d'une autre table (selon le type de OUTER JOIN). En dehors de FULL OUTER JOIN, il existe deux autres types :

  • A LEFT OUTER JOIN renvoie toutes les lignes de la table de gauche, même si aucune ligne correspondante n'a été trouvée dans la table de droite. S'il n'y a pas d'enregistrements correspondants dans la table de droite, la requête renvoie des valeurs NULL pour ces colonnes.
  • Un RIGHT OUTER JOIN renvoie toutes les lignes de la bonne table. S'il n'y a pas d'enregistrements correspondants dans la table de gauche, des valeurs NULL sont renvoyées pour ces colonnes - l'inverse d'un LEFT JOIN.

Un CROSS JOIN (également appelé un JOIN cartésien) renvoie toutes les combinaisons possibles de lignes des tables qui ont été jointes. Comme il renvoie toutes les combinaisons possibles, c'est le seul type de JOIN qui ne nécessite pas de condition JOIN et donc pas de clause ON.

Pour un examen plus détaillé de chacun des types de JOIN, consultez l'article Les types de jointures SQL expliqués. En outre, notre Les jointures en SQL couvre tous les différents types et cas d'utilisation des JOIN de manière très détaillée. Il aborde également des sujets plus avancés, tels que les JOIN non équi et les JOIN multiples.

Les jointures sont l'une des fonctionnalités les plus fondamentales et les plus couramment utilisées de SQL et constituent une partie essentielle de la boîte à outils de tout utilisateur de SQL. Elles figurent également dans les questions d'entretien les plus courantes ; consultez notre article Les 10 principales questions d'entretien SQL JOIN et comment y répondre pour obtenir des conseils utiles.

Améliorez votre connaissance des FULL JOINs SQL

Dans ce tutoriel, vous avez appris les spécificités de SQL FULL JOINs et leurs principaux cas d'utilisation dans le diagnostic de l'intégrité des données. Vous avez également vu une brève comparaison entre FULL JOINs et les autres types de JOIN.

Pour vraiment comprendre FULL JOINs, vous devez vous plonger dans le grand bain, faire des exercices et relever des défis. Je vous recommande vivement d'essayer notre cours Les jointures en SQL pour passer au niveau supérieur de cette fonctionnalité SQL très importante.