Sommaire
Introduction aux JOIN
Les opérations JOIN en SQL sont essentielles pour combiner des données provenant de plusieurs tables en fonction d’une condition de correspondance. Elles permettent de créer des requêtes complexes et d’extraire des informations pertinentes à partir de bases de données relationnelles.
Pourquoi les JOIN sont-ils indispensables ?
Dans une base de données relationnelle, les données sont réparties dans plusieurs tables pour éviter la redondance. Les JOIN permettent de reconnecter ces informations dispersées.
90%
des requêtes analytiques utilisent au moins un JOIN
Stack Overflow Survey, 2025
4
types principaux à maîtriser absolument
INNER, LEFT, RIGHT, FULL


Diagramme récapitulatif des 4 JOIN (cercles de Venn)
1. INNER JOIN
Définition :
L’INNER JOIN retourne uniquement les lignes où il y a une correspondance entre les deux tables. Si aucune correspondance n’est trouvée, la ligne est exclue du résultat.
Schéma
INNER JOIN (intersection)
Table A Table B
┌─────────┐ ┌─────────┐
│ A1 │ │ B1 │
│ A2 │ + │ B2 │ = [A2, B2] ← Correspondance trouvée
│ A3 │ │ B3 │
└─────────┘ └─────────┘
Résultat de INNER JOIN :
[A2, B2]
Exemple pratique
Clients ayant passé au moins une commande
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
INNER JOIN Commandes o
ON c.ClientID = o.ClientID;Cas d’utilisation
- Lister les clients ayant effectué au moins une commande
- Trouver les produits commandés (exclure ceux jamais vendus)
- Joindre des tables de référence (ex: produits et catégories)
2. LEFT JOIN (ou LEFT OUTER JOIN)
Définition :
Le LEFT JOIN renvoie toutes les lignes de la table de gauche (première table) et les lignes correspondantes de la table de droite. Si aucune correspondance n’est trouvée, les colonnes de la table de droite contiendront des valeurs NULL.
Schéma
LEFT JOIN (toute la table de gauche)
Table A Table B
┌─────────┐ ┌─────────┐
│ A1 │ │ │ ← Pas de correspondance
│ A2 │ + │ B2 │ ← Correspondance trouvée
│ A3 │ │ │ ← Pas de correspondance
└─────────┘ └─────────┘
Résultat de LEFT JOIN :
[A1, NULL]
[A2, B2]
[A3, NULL]Exemple pratique
Tous les clients (même sans commande)
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
LEFT JOIN Commandes o
ON c.ClientID = o.ClientID;Cas d’utilisation
- Identifier les clients qui n’ont jamais passé de commande
- Lister tous les produits, même ceux sans vente
- Conserver toutes les lignes de la table principale (ex: annuaire complet)
Astuce : Pour trouver les clients sans commande, ajoutez WHERE o.OrderID IS NULL.
3. RIGHT JOIN (ou RIGHT OUTER JOIN)
Définition :
Le RIGHT JOIN est l’inverse du LEFT JOIN : il renvoie toutes les lignes de la table de droite, et les lignes correspondantes de la table de gauche. En l’absence de correspondance, les colonnes de la table de gauche contiendront des valeurs NULL.
Schéma
RIGHT JOIN (toute la table de droite)
Table A Table B
┌─────────┐ ┌─────────┐
│ │ │ B1 │ ← Pas de correspondance
│ A2 │ + │ B2 │ ← Correspondance trouvée
│ │ │ B3 │ ← Pas de correspondance
└─────────┘ └─────────┘
Résultat de RIGHT JOIN :
[NULL, B1]
[A2, B2]
[NULL, B3]Exemple pratique
Toutes les commandes (même sans client associé)
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
RIGHT JOIN Commandes o
ON c.ClientID = o.ClientID;Cas d’utilisation
- Identifier les commandes orphelines (sans client valide)
- Analyser les données d’une table “enfant” même si la table “parent” a des trous
Note : RIGHT JOIN est moins utilisé que LEFT JOIN. On peut toujours réécrire un RIGHT JOIN en LEFT JOIN en inversant l’ordre des tables.
4. FULL JOIN (ou FULL OUTER JOIN)
Définition :
Le FULL JOIN combine les résultats du LEFT JOIN et du RIGHT JOIN. Il renvoie toutes les lignes des deux tables, en remplissant avec des NULL là où il n’existe pas de correspondance.
Schéma
FULL JOIN (union des deux tables)
Table A Table B
┌─────────┐ ┌─────────┐
│ A1 │ │ B1 │ ← Pas de correspondance dans A pour B1
│ A2 │ + │ B2 │ ← Correspondance trouvée
│ A3 │ │ B3 │ ← Pas de correspondance dans A pour B3
└─────────┘ └─────────┘
Résultat de FULL JOIN :
[A1, NULL]
[A2, B2]
[NULL, B1]
[NULL, B3]Exemple pratique
Vue complète clients + commandes
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
FULL OUTER JOIN Commandes o
ON c.ClientID = o.ClientID;Cas d’utilisation
- Identifier à la fois les clients sans commandes ET les commandes sans clients
- Fusionner deux tables ayant des données partiellement chevauchantes
- Audit de qualité des données (incohérences référentielles)
Simulation quand FULL JOIN n’est pas supporté
Alternative avec UNION (MySQL, SQLite)
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
LEFT JOIN Commandes o ON c.ClientID = o.ClientID
UNION
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
RIGHT JOIN Commandes o ON c.ClientID = o.ClientID;Support SGBD :
✅ PostgreSQL, SQL Server, Oracle supportent FULL OUTER JOIN.
❌ MySQL, SQLite ne le supportent pas (utiliser l’alternative UNION).
Tableau comparatif des 4 JOIN
| JOIN | Ce qui est inclus | NULL possible | Cas d’usage typique |
|---|---|---|---|
| INNER JOIN | Uniquement les correspondances | Non | Clients qui ont commandé |
| LEFT JOIN | Toute la table de gauche + correspondances de droite | Oui (côté droit) | Tous les clients (même sans commande) |
| RIGHT JOIN | Toute la table de droite + correspondances de gauche | Oui (côté gauche) | Toutes les commandes (même sans client) |
| FULL OUTER JOIN | Les deux tables complètes | Oui (des deux côtés) | Fusion complète, audit de cohérence |

cercles de Venn INNER, LEFT, RIGHT, FULL
JOIN sur plusieurs tables
Il est possible d’enchaîner plusieurs JOIN pour combiner 3 tables ou plus.
3 tables : Clients → Commandes → Produits
SELECT c.Nom, o.Date, p.NomProduit, l.Quantite
FROM Clients c
INNER JOIN Commandes o ON c.ClientID = o.ClientID
INNER JOIN LignesCommande l ON o.OrderID = l.OrderID
INNER JOIN Produits p ON l.ProduitID = p.ProduitID
WHERE o.Date >= '2025-01-01';Ordre des JOIN :
Dans un INNER JOIN, l’ordre des tables n’affecte pas le résultat. Avec les OUTER JOIN (LEFT/RIGHT), l’ordre est crucial car il détermine quelle table est “préservée”.
Performances et bonnes pratiques
1. Indexez les colonnes de jointure
Les colonnes utilisées dans la clause ON doivent être indexées pour accélérer les JOIN.
2. Filtrez avant de joindre quand c’est possible
Utilisez des sous-requêtes ou des CTE pour réduire les volumes avant la jointure.
3. Évitez les JOIN inutiles
Ne joignez que les tables strictement nécessaires. Chaque JOIN ajoute de la complexité.
4. Préférez INNER JOIN à LEFT JOIN quand vous n’avez pas besoin des NULL
INNER JOIN est généralement plus rapide car il exclut les non-correspondances.
Commande utile :
Utilisez EXPLAIN (MySQL, PostgreSQL) ou EXPLAIN PLAN (SQL Server, Oracle) pour analyser le plan d’exécution de vos requêtes et identifier les JOIN coûteux.
FAQ
Quelle est la différence entre INNER JOIN et LEFT JOIN ?
INNER JOIN ne retourne que les lignes qui ont une correspondance dans les deux tables. LEFT JOIN retourne toutes les lignes de la table de gauche (première table), même sans correspondance dans la table de droite. Pour trouver les clients sans commande, LEFT JOIN est indispensable.
Quand utiliser RIGHT JOIN plutôt que LEFT JOIN ?
RIGHT JOIN est plus rare. Il peut être utile quand vous voulez préserver toutes les lignes de la table de droite. En pratique, on peut toujours réécrire un RIGHT JOIN en LEFT JOIN en inversant l'ordre des tables. La plupart des développeurs préfèrent LEFT JOIN pour la lisibilité.
Tous les SGBD supportent-ils FULL OUTER JOIN ?
Non. PostgreSQL, SQL Server et Oracle le supportent. MySQL et SQLite ne le supportent pas nativement. Pour MySQL, simulez-le avec UNION entre un LEFT JOIN et un RIGHT JOIN.
Peut-on faire un JOIN sur plus de deux tables ?
Oui, sans limite théorique. On enchaîne les JOIN : FROM A JOIN B ON ... JOIN C ON .... Cependant, trop de JOIN (plus de 5-6) peuvent dégrader les performances et la lisibilité. Dans ce cas, envisagez une refonte du schéma ou des CTE.
Qu'est-ce qu'un self-JOIN ?
Un self-JOIN est un JOIN d'une table avec elle-même. Il nécessite des alias différents. Exemple : trouver les employés et leur manager dans une même table Employes : SELECT e.Nom, m.Nom FROM Employes e LEFT JOIN Employes m ON e.ManagerID = m.EmployeID.
Quelle est la différence entre JOIN et UNION ?
JOIN combine des colonnes de plusieurs tables horizontalement (ajoute des colonnes). UNION combine des lignes de plusieurs requêtes verticalement (ajoute des lignes). Les JOIN sont utilisés pour des données liées par des clés étrangères ; UNION pour concaténer des résultats similaires.
Conclusion
Les JOIN en SQL sont des outils puissants pour combiner des données provenant de plusieurs tables. Voici un résumé des 4 types principaux :
Récapitulatif
- INNER JOIN : Renvoie uniquement les lignes avec correspondance.
- LEFT JOIN : Renvoie toutes les lignes de la table de gauche, avec NULL si aucune correspondance.
- RIGHT JOIN : Renvoie toutes les lignes de la table de droite, avec NULL si aucune correspondance.
- FULL OUTER JOIN : Renvoie toutes les lignes des deux tables, avec NULL de chaque côté.
Pour aller plus loin : Découvrez notre tutoriel sur les fonctions de fenêtrage SQL pour des analyses encore plus avancées.
Faites parler vos données
Apprenez les méthodes et les outils pour extraire de la valeur stratégique : Data Science : Le guide complet des méthodes et outils.