Les Jointures SQL : INNER, LEFT, RIGHT, FULL

Combiner des tables avec JOIN — syntaxe, schémas visuels, exemples concrets et pièges

9
Sections
20+
Exemples
SQL
Standard

SECTION 01

Les données d’exemple

📋 Deux tables liées

Tous les exemples de cette fiche utilisent ces deux tables :

— Table clients
— 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.

SECTION 02

INNER JOIN — seulement les correspondances

🔗 L’intersection

INNER JOIN retourne uniquement les lignes qui ont une correspondance dans les deux tables. Pas de match = pas dans le résultat.

SELECT c.nom, co.produit, co.montant
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.

SECTION 03

LEFT JOIN — toute la table de gauche

⬅️ Tout à gauche + correspondances à droite

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.

SELECT c.nom, co.produit, co.montant
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

🔍 Trouver les clients SANS commande
SELECT c.nom
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.

SECTION 04

RIGHT JOIN — toute la table de droite

➡️ L’inverse du LEFT JOIN

RIGHT JOIN retourne toutes les lignes de la table de droite, même sans correspondance à gauche.

SELECT c.nom, co.produit, co.montant
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é.

SECTION 05

FULL OUTER JOIN — tout des deux côtés

↔️ L’union complète

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é.

SELECT c.nom, co.produit, co.montant
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.

SECTION 06

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.

— 3 tailles × 4 couleurs = 12 combinaisons
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…).

SECTION 07

Self JOIN — joindre une table avec elle-même

— Table employes
— 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.

SECTION 08

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)

SECTION 09

Questions fréquentes

JOIN ou INNER JOIN — y a-t-il une différence ?
Aucune. JOIN est un raccourci de INNER JOIN. Le résultat est identique. Par convention, beaucoup de développeurs écrivent INNER JOIN explicitement pour la clarté, surtout quand la requête contient aussi des LEFT JOIN.
Peut-on joindre plus de 2 tables ?
Oui, tu peux enchaîner autant de JOIN que nécessaire : FROM clients c JOIN commandes co ON … JOIN produits p ON …. Chaque JOIN ajoute une table au résultat. L’ordre des JOIN peut affecter la lisibilité mais pas le résultat (l’optimiseur réarrange).
ON vs WHERE pour la condition de jointure ?
La condition de liaison entre tables va dans le ON. Les filtres sur les données vont dans le WHERE. Avec un INNER JOIN le résultat est identique, mais avec un LEFT JOIN, mettre un filtre dans le ON ou le WHERE change le résultat — le WHERE filtre après la jointure.
Comment émuler FULL OUTER JOIN en MySQL ?
Combine un LEFT JOIN et un RIGHT JOIN avec UNION : SELECT … FROM A LEFT JOIN B ON … UNION SELECT … FROM A RIGHT JOIN B ON …. Le UNION élimine les doublons. Utilise UNION ALL si tu veux garder les doublons.

Les jointures SQL — INNER, LEFT, RIGHT, FULL, CROSS et Self JOIN

Référence : sql.sh Jointures