Maîtriser SQL, c’est souvent savoir poser les bonnes questions. Quand tes données sont réparties sur plusieurs tables, la jointure externe complète devient franchement pratique. Assez courant dans certains systèmes de gestion de bases de données, le FULL OUTER JOIN est un peu plus délicat dans MySQL. Pourquoi ? Parce qu’il n’y est tout simplement pas pris en charge. Intéressant, non ? Mais pas de panique, il existe une solution de contournement !
Dans ce tutoriel, on explore en détail comment réaliser un full outer join dans MySQL. Accroche-toi, on plonge dans un bain d’exemples de code.
🔖 Référence rapide : besoin d’un aperçu rapide de tous les types de JOIN ? Jette un œil à notre aide-mémoire des JOIN SQL, avec des schémas et des exemples de code.
Qu’est-ce qu’un full outer join ?
Avant de commencer, définissons ce qu’est un FULL OUTER JOIN. En SQL, une jointure externe complète combine les effets d’une jointure externe gauche et d’une jointure externe droite. Autrement dit, elle récupère les enregistrements dont les valeurs correspondent dans les deux tables, ainsi que tous les enregistrements des deux tables qui n’ont pas de correspondance dans l’autre table.
Voici un exemple. Supposons qu’on ait deux tables, Employees et Departments.
Table Employees :
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Table Departments :
| id | department |
|---|---|
| 2 | HR |
| 3 | IT |
| 4 | Marketing |
Avec la requête FULL OUTER JOIN :
SELECT * FROM Employees
FULL OUTER JOIN Departments ON Employees.id = Departments.id;
Le résultat sera :
| Employees.id | Employees.name | Departments.id | Departments.department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Ce résultat combine tous les enregistrements de Employees et de Departments. Il comprend :
- Les enregistrements dont la valeur
idcorrespond dans les deux tables (Bob et Charlie). - Les enregistrements de
Employeessans correspondance dansDepartments(Alice). - Les enregistrements de
Departmentssans correspondance dansEmployees(Marketing).
Bien que très utile, cette syntaxe n’est pas directement prise en charge par MySQL. Alors, comment s’en sortir ? Voyons ça.
Simuler un full outer join dans MySQL
Comme indiqué plus haut, MySQL ne prend pas explicitement en charge le mot-clé FULL OUTER JOIN. On peut toutefois obtenir le résultat voulu en combinant LEFT JOIN et UNION
Simuler un full outer join dans MySQL se fait en deux étapes :
- Faire un
LEFT JOINsur la première table pour récupérer tous ses enregistrements, ainsi que les enregistrements correspondants de la seconde table. - Utiliser
UNIONpour combiner ces résultats avec ceux d’unRIGHT JOIN, afin de récupérer tous les enregistrements de la seconde table ainsi que les enregistrements correspondants de la première.
Voici comment fonctionne chaque partie :
Left Join :
Right Join :
Exemple de full outer join dans MySQL
Voici un exemple de cette solution de contournement, avec les mêmes données que précédemment
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Employees
LEFT JOIN
Departments ON Employees.id = Departments.id
UNION
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Departments
RIGHT JOIN
Employees ON Departments.id = Employees.id;
Cette requête se compose de deux parties :
- Un
LEFT JOINpour récupérer tous les enregistrements de la tableEmployeeset les enregistrements correspondants de la tableDepartments. - Un
RIGHT JOINpour récupérer tous les enregistrements de la tableDepartmentset les enregistrements correspondants de la tableEmployees.
UNION combine les résultats de ces deux requêtes tout en éliminant les lignes en double.
Avec les mêmes tables d’exemple, le résultat sera :
| Employees_id | name | Departments_id | department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Comme le FULL OUTER JOIN en SQL, ce résultat combine tous les enregistrements de Employees et de Departments.
UNION filtre automatiquement les doublons
Dans le cas précis de notre exemple avec les tables Employees et Departments, le UNION utilisé pour contourner l’absence de FULL OUTER JOIN dans MySQL ne produira pas de doublons. En effet, l’opérateur UNION élimine automatiquement les lignes en double de son résultat.
Pour clarifier, voyons comment UNION fonctionne dans ce contexte :
-
La première partie de la requête (le
LEFT JOIN) récupère tous les enregistrements de la table Employees et les enregistrements correspondants de la table Departments. Cela inclut les lignes dont la valeur id correspond dans les deux tables et les lignes d’Employees sans correspondance dans Departments. -
La seconde partie de la requête (le
RIGHT JOIN) récupère tous les enregistrements de la table Departments et les enregistrements correspondants de la table Employees. Cela inclut les lignes dont la valeur id correspond dans les deux tables et les lignes de Departments sans correspondance dans Employees.
Comme UNION supprime les doublons, les lignes dont la valeur id correspond (celles qui apparaîtraient à la fois dans les résultats du LEFT JOIN et du RIGHT JOIN) n’apparaîtront qu’une seule fois dans le résultat final.
En résumé, utiliser UNION dans ce contexte garantit que chaque combinaison unique de données Employees et Departments n’apparaît qu’une fois dans le résultat, ce qui reproduit le comportement d’un FULL OUTER JOIN sans doublons.
Entraîne-toi dans Beekeeper Studio
J’espère que ce tutoriel sur le full outer join dans MySQL t’a été utile. Dans de prochains articles, on continuera à explorer d’autres fonctionnalités avancées de MySQL, avec plus d’exemples de code, en creusant pourquoi et comment elles fonctionnent. D’ici là, continue à pratiquer SQL, idéalement avec Beekeeper Studio.
Beekeeper Studio est une interface de base de données gratuite & open source
Le meilleur outil de requêtes & éditeur SQL que j’aie jamais utilisé. Il m’offre tout ce dont j’ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge plein de bases de données et fonctionne parfaitement sous Windows, Mac et Linux.
Ce que les utilisateurs disent de Beekeeper Studio
« Beekeeper Studio a complètement remplacé mon ancien workflow SQL. C’est rapide, intuitif, et ça rend le travail sur les bases de données à nouveau agréable. »
« J’ai essayé beaucoup d’interfaces de base de données, mais Beekeeper trouve le parfait équilibre entre fonctionnalités et simplicité. Ça marche, tout simplement. »