Les Jointures SQL : INNER, LEFT, RIGHT, FULL
Combiner des tables avec JOIN — syntaxe, schémas visuels, exemples concrets et pièges
Les données d’exemple
Tous les exemples de cette fiche utilisent ces deux tables :
— id | nom | ville
— 1 | Alice | Paris
— 2 | Bob | Lyon
— 3 | Charlie | Marseille
— 4 | Diana | Lille ← aucune commande
— Table commandes
— id | client_id | produit | montant
— 1 | 1 | Laptop | 999
— 2 | 1 | Souris | 29
— 3 | 2 | Clavier | 79
— 4 | 5 | Écran | 349 ← client_id 5 n’existe pas
Diana (id 4) n’a aucune commande. La commande 4 référence un client_id 5 qui n’existe pas. Ces cas sont volontaires pour montrer le comportement de chaque jointure.
INNER JOIN — seulement les correspondances
INNER JOIN retourne uniquement les lignes qui ont une correspondance dans les deux tables. Pas de match = pas dans le résultat.
FROM clients c
INNER JOIN commandes co ON c.id = co.client_id;
— Résultat :
— nom | produit | montant
— Alice | Laptop | 999
— Alice | Souris | 29
— Bob | Clavier | 79
— ❌ Diana absente (pas de commande)
— ❌ Commande 4 absente (client_id 5 inexistant)
INNER JOIN est la jointure par défaut. Écrire JOIN sans préfixe est équivalent à INNER JOIN. C’est la jointure la plus courante et la plus performante.
LEFT JOIN — toute la table de gauche
LEFT JOIN retourne toutes les lignes de la table de gauche, même si elles n’ont pas de correspondance. Les colonnes de la table de droite sont NULL quand il n’y a pas de match.
FROM clients c
LEFT JOIN commandes co ON c.id = co.client_id;
— Résultat :
— nom | produit | montant
— Alice | Laptop | 999
— Alice | Souris | 29
— Bob | Clavier | 79
— Charlie | NULL | NULL ← pas de commande
— Diana | NULL | NULL ← pas de commande
FROM clients c
LEFT JOIN commandes co ON c.id = co.client_id
WHERE co.id IS NULL;
— Résultat : Charlie, Diana
Le pattern LEFT JOIN … WHERE right.id IS NULL est très courant pour trouver les éléments « orphelins » — clients sans commande, produits jamais vendus, utilisateurs sans activité, etc.
RIGHT JOIN — toute la table de droite
RIGHT JOIN retourne toutes les lignes de la table de droite, même sans correspondance à gauche.
FROM clients c
RIGHT JOIN commandes co ON c.id = co.client_id;
— Résultat :
— nom | produit | montant
— Alice | Laptop | 999
— Alice | Souris | 29
— Bob | Clavier | 79
— NULL | Écran | 349 ← client_id 5 n’existe pas
En pratique, RIGHT JOIN est rarement utilisé. Tu peux toujours le remplacer par un LEFT JOIN en inversant l’ordre des tables. La plupart des développeurs préfèrent LEFT JOIN pour la lisibilité.
FULL OUTER JOIN — tout des deux côtés
FULL OUTER JOIN retourne toutes les lignes des deux tables. NULL quand il n’y a pas de correspondance de l’un ou l’autre côté.
FROM clients c
FULL OUTER JOIN commandes co ON c.id = co.client_id;
— Résultat :
— nom | produit | montant
— Alice | Laptop | 999
— Alice | Souris | 29
— Bob | Clavier | 79
— Charlie | NULL | NULL ← client sans commande
— Diana | NULL | NULL ← client sans commande
— NULL | Écran | 349 ← commande orpheline
⚠️ FULL OUTER JOIN n’est pas supporté par MySQL. Pour l’émuler en MySQL, utilise un LEFT JOIN UNION RIGHT JOIN. Il est supporté nativement par PostgreSQL, SQL Server et Oracle.
CROSS JOIN — le produit cartésien
CROSS JOIN combine chaque ligne de la première table avec chaque ligne de la seconde. Pas de condition ON.
SELECT t.nom AS taille, c.nom AS couleur
FROM tailles t
CROSS JOIN couleurs c;
— S | Rouge
— S | Bleu
— S | Vert
— S | Noir
— M | Rouge
— …
⚠️ Un CROSS JOIN entre deux tables de 1 000 lignes produit 1 000 000 de lignes. Utilise-le uniquement sur des petites tables de référence (tailles, couleurs, mois, créneaux horaires…).
Self JOIN — joindre une table avec elle-même
— id | nom | manager_id
— 1 | Alice | NULL (PDG)
— 2 | Bob | 1
— 3 | Charlie | 1
— 4 | Diana | 2
— Trouver chaque employé avec son manager
SELECT e.nom AS employe, m.nom AS manager
FROM employes e
LEFT JOIN employes m ON e.manager_id = m.id;
— employe | manager
— Alice | NULL (pas de manager)
— Bob | Alice
— Charlie | Alice
— Diana | Bob
Le self join utilise des alias différents (e et m) pour distinguer les deux « copies » de la même table. Cas d’usage courant : hiérarchie employé/manager, catégorie/sous-catégorie, ami/ami.
Tableau comparatif
| Jointure | Lignes retournées | NULL possible | Usage courant |
|---|---|---|---|
| INNER JOIN | Correspondances uniquement | Non | Cas par défaut (90% des requêtes) |
| LEFT JOIN | Tout à gauche + matches à droite | Oui (colonnes droite) | Trouver les orphelins, rapports complets |
| RIGHT JOIN | Tout à droite + matches à gauche | Oui (colonnes gauche) | Rarement utilisé (préférer LEFT JOIN) |
| FULL OUTER JOIN | Tout des deux côtés | Oui (les deux) | Reconciliation, audit de données |
| CROSS JOIN | Produit cartésien (N × M) | Non | Combinaisons (tailles × couleurs) |
| Self JOIN | Dépend du type de JOIN utilisé | Dépend | Hiérarchies (employé/manager) |
Questions fréquentes
📊 GROUP BY & HAVING
🔍 Sous-requêtes
⚖️ WHERE vs HAVING
🔢 Fonctions d’agrégation
🔗 UNION vs UNION ALL
🗄️ Cours SQL complet
🏠 Hub Programmation
Les jointures SQL — INNER, LEFT, RIGHT, FULL, CROSS et Self JOIN
Référence : sql.sh Jointures
