Les jointures SQL expliquées simplement : INNER, LEFT, RIGHT et FULL JOIN
Dès qu'une base de données compte plus d'une table, il faut savoir les combiner. C'est le rôle des jointures (JOIN). Ce tutoriel couvre les quatre types de jointures les plus utilisés, avec des exemples que vous pouvez tester directement.
Les tables d'exemple
Pour illustrer chaque jointure, on utilise deux tables simples : clients et commandes.
| id | nom |
|---|---|
| 1 | Amina |
| 2 | Karim |
| 3 | Julie |
| id | client_id | montant |
|---|---|---|
| 101 | 1 | 49.90 |
| 102 | 1 | 12.00 |
| 103 | 4 | 8.50 |
Remarquez que Julie (id 3) n'a aucune commande, et que la commande 103 appartient à un client_id 4 qui n'existe pas dans clients. C'est volontaire, pour bien voir la différence entre chaque jointure.
INNER JOIN : uniquement les correspondances
INNER JOIN ne retourne que les lignes où la condition de jointure trouve une correspondance dans les deux tables.
SELECT c.nom, co.montant
FROM clients c
INNER JOIN commandes co ON co.client_id = c.id;
Résultat : Amina apparaît deux fois (une par commande), Karim et Julie n'apparaissent pas car ils n'ont pas de commande correspondante des deux côtés.
LEFT JOIN : tout de la table de gauche
LEFT JOIN (ou LEFT OUTER JOIN) garde toutes les lignes de la table de gauche, même sans correspondance à droite. Les colonnes manquantes sont remplies avec NULL.
SELECT c.nom, co.montant
FROM clients c
LEFT JOIN commandes co ON co.client_id = c.id;
Résultat : Amina (x2), Karim avec montant = NULL, Julie avec montant = NULL. C'est la jointure la plus utilisée en pratique, notamment pour trouver les lignes "orphelines" (par exemple, les clients sans aucune commande) avec un WHERE co.id IS NULL.
RIGHT JOIN : tout de la table de droite
RIGHT JOIN fait l'inverse : il garde toutes les lignes de la table de droite.
SELECT c.nom, co.montant
FROM clients c
RIGHT JOIN commandes co ON co.client_id = c.id;
Résultat : Amina (x2), et la commande 103 apparaît avec nom = NULL puisqu'aucun client n'a l'id 4.
RIGHT JOIN en LEFT JOIN en inversant l'ordre des tables. Cela rend les requêtes plus faciles à lire de gauche à droite.FULL JOIN : tout, des deux côtés
FULL JOIN (ou FULL OUTER JOIN) combine LEFT et RIGHT : toutes les lignes des deux tables apparaissent, avec des NULL là où il n'y a pas de correspondance.
SELECT c.nom, co.montant
FROM clients c
FULL JOIN commandes co ON co.client_id = c.id;
Note : MySQL ne supporte pas FULL JOIN nativement ; il faut simuler ce comportement avec un UNION d'un LEFT JOIN et d'un RIGHT JOIN.
Résumé visuel
| Type | Ce qu'il retourne |
|---|---|
| INNER JOIN | Uniquement les lignes qui correspondent des deux côtés |
| LEFT JOIN | Tout à gauche + correspondances à droite (NULL sinon) |
| RIGHT JOIN | Tout à droite + correspondances à gauche (NULL sinon) |
| FULL JOIN | Tout des deux côtés, avec NULL là où ça ne correspond pas |
ON sont indexées, surtout sur les grandes tables. Voir notre article sur les index SQL pour aller plus loin.