Les jointures SQL : INNER, LEFT, RIGHT et FULL JOIN expliquées
Dès qu’une base de données contient plusieurs tables, une question revient sans cesse : comment croiser les informations de deux tables pour obtenir un résultat unique ? C’est le rôle des jointures SQL. Récupérer le nom du client associé à chaque commande, la désignation d’un produit à partir de son identifiant, le service d’un employé… tout cela passe par une jointure.
Il existe quatre grands types de jointures — INNER JOIN, LEFT JOIN, RIGHT JOIN et FULL JOIN — et choisir le bon fait toute la différence entre un résultat juste et un résultat trompeur. Cet article les explique un par un, avec des exemples concrets et leur résultat. Il complète notre panorama des requêtes SQL essentielles du quotidien.
Le jeu de données d’exemple
Tous les exemples s’appuient sur deux tables. Une table employes :
| id_employe | nom | id_service |
|---|---|---|
| 1 | Martin | 10 |
| 2 | Durand | 20 |
| 3 | Petit | 10 |
| 4 | Moreau | NULL |
Et une table services :
| id_service | libelle |
|---|---|
| 10 | Informatique |
| 20 | Comptabilité |
| 30 | Marketing |
Remarquez deux points qui vont tout illustrer : l’employé Moreau n’a pas de service (id_service à NULL), et le service Marketing (id 30) n’a aucun employé. Ce sont exactement ces cas « aux bords » qui distinguent les types de jointures.
Le principe d’une jointure
Une jointure relie deux tables sur une condition, généralement l’égalité entre une colonne de la première et une colonne de la seconde. Ici, le lien naturel est employes.id_service = services.id_service. La syntaxe générale est :
SELECT colonnes
FROM table1
[TYPE] JOIN table2
ON table1.colonne = table2.colonne;
Le mot qui remplace [TYPE] (INNER, LEFT, RIGHT, FULL) détermine quelles lignes sont conservées quand la correspondance n’existe pas des deux côtés. C’est tout l’enjeu.
INNER JOIN : uniquement les correspondances
La jointure interne ne renvoie que les lignes qui ont une correspondance dans les deux tables. C’est la plus courante.
SELECT e.nom, s.libelle
FROM employes e
INNER JOIN services s
ON e.id_service = s.id_service;
Résultat :
| nom | libelle |
|---|---|
| Martin | Informatique |
| Durand | Comptabilité |
| Petit | Informatique |
Moreau disparaît (son service est NULL, aucune correspondance) et Marketing disparaît aussi (aucun employé). L’INNER JOIN ne garde que l’intersection : les lignes appariées des deux côtés. Notez au passage l’usage des alias (e et s) qui allègent l’écriture.
LEFT JOIN : toute la table de gauche
La jointure gauche conserve toutes les lignes de la table de gauche (celle du FROM), même sans correspondance à droite. Les colonnes de droite sont alors remplies avec NULL.
SELECT e.nom, s.libelle
FROM employes e
LEFT JOIN services s
ON e.id_service = s.id_service;
Résultat :
| nom | libelle |
|---|---|
| Martin | Informatique |
| Durand | Comptabilité |
| Petit | Informatique |
| Moreau | NULL |
Cette fois Moreau apparaît, avec un service à NULL. C’est le grand intérêt du LEFT JOIN : ne perdre aucune ligne de la table principale. On l’utilise typiquement pour répondre à « tous les employés, avec leur service s’il existe ». Marketing, en revanche, reste absent (il n’est pas dans la table de gauche).
RIGHT JOIN : toute la table de droite
La jointure droite est le miroir de la précédente : elle conserve toutes les lignes de la table de droite, même sans correspondance à gauche.
SELECT e.nom, s.libelle
FROM employes e
RIGHT JOIN services s
ON e.id_service = s.id_service;
Résultat :
| nom | libelle |
|---|---|
| Martin | Informatique |
| Petit | Informatique |
| Durand | Comptabilité |
| NULL | Marketing |
Ici c’est Marketing qui apparaît (service sans employé, nom à NULL), tandis que Moreau disparaît. En pratique, le RIGHT JOIN est peu utilisé : on préfère souvent inverser l’ordre des tables et écrire un LEFT JOIN, plus lisible. Les deux formulations suivantes donnent le même résultat :
-- Ces deux requêtes sont équivalentes :
FROM employes e RIGHT JOIN services s ON …
FROM services s LEFT JOIN employes e ON …
FULL JOIN : tout des deux côtés
La jointure complète (ou FULL OUTER JOIN) conserve toutes les lignes des deux tables, appariées quand c’est possible, avec des NULL partout où la correspondance manque.
SELECT e.nom, s.libelle
FROM employes e
FULL JOIN services s
ON e.id_service = s.id_service;
Résultat :
| nom | libelle |
|---|---|
| Martin | Informatique |
| Durand | Comptabilité |
| Petit | Informatique |
| Moreau | NULL |
| NULL | Marketing |
On retrouve à la fois Moreau et Marketing : le FULL JOIN ne laisse aucune ligne de côté. C’est utile pour repérer les « orphelins » des deux tables — par exemple les employés sans service et les services sans employé, en une seule requête.
Récapitulatif visuel
| Type | Lignes conservées | Dans notre exemple |
|---|---|---|
INNER JOIN |
Correspondances des deux côtés | Ni Moreau, ni Marketing |
LEFT JOIN |
Toute la table de gauche | + Moreau |
RIGHT JOIN |
Toute la table de droite | + Marketing |
FULL JOIN |
Tout des deux tables | + Moreau et Marketing |
Points d’attention et compatibilité
- MySQL ne connaît pas FULL JOIN. Pour l’émuler, on combine un LEFT JOIN et un RIGHT JOIN avec
UNION. Oracle, PostgreSQL et SQL Server le prennent en charge nativement. - Attention aux doublons. Si la colonne de jointure n’est pas unique dans une table, chaque ligne de gauche peut être associée à plusieurs lignes de droite — le résultat gonfle. Vérifiez toujours la cardinalité de votre lien. Pour accélérer les jointures sur de grosses tables, pensez aux index SQL.
- Le mot
OUTERest optionnel.LEFT JOINetLEFT OUTER JOINsont strictement équivalents ; de même pour RIGHT et FULL.INNERaussi peut être omis (un simpleJOINest un INNER JOIN). - Jointure sur plusieurs colonnes : la clause
ONpeut combiner plusieurs conditions avecAND, quand le lien repose sur plus d’une colonne.
En résumé
Le choix du type de jointure se résume à une question : quelles lignes voulez-vous garder quand la correspondance manque ? INNER pour l’intersection stricte, LEFT pour tout garder à gauche, RIGHT pour tout garder à droite, FULL pour ne rien perdre. Dans la pratique, INNER et LEFT couvrent l’immense majorité des besoins. Une fois ce réflexe acquis, les jointures deviennent l’un des outils les plus puissants du SQL pour croiser vos données. La prise en charge exacte (comme FULL JOIN) varie selon les moteurs : voyez notre comparatif des SGBD relationnels.