Tutoriel sur les fonctions de fenêtrage SQL
Pour des analyses avancées (ROW_NUMBER, RANK, LEAD, LAG).
INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN : maîtrisez toutes les façons de combiner vos tables relationnelles. Exemples concrets, schémas et cas d'usage.
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.
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.


Diagramme récapitulatif des 4 JOIN (cercles de Venn)
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.
Table A Table B
┌─────────┐ ┌─────────┐
│ A1 │ │ B1 │
│ A2 │ + │ B2 │ = [A2, B2] ← Correspondance trouvée
│ A3 │ │ B3 │
└─────────┘ └─────────┘
Résultat de INNER JOIN :
[A2, B2]

SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
INNER JOIN Commandes o
ON c.ClientID = o.ClientID;
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.
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]
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
LEFT JOIN Commandes o
ON c.ClientID = o.ClientID;
WHERE o.OrderID IS NULL.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.
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]
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
RIGHT JOIN Commandes o
ON c.ClientID = o.ClientID;
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.
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]
SELECT c.ClientID, c.Nom, o.OrderID, o.Date
FROM Clients c
FULL OUTER JOIN Commandes o
ON c.ClientID = o.ClientID;
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;
✅ PostgreSQL, SQL Server, Oracle supportent FULL OUTER JOIN.
❌ MySQL, SQLite ne le supportent pas (utiliser l'alternative UNION).
| 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
Il est possible d'enchaîner plusieurs JOIN pour combiner 3 tables ou plus.
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';
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".
Les colonnes utilisées dans la clause ON doivent être indexées pour accélérer les JOIN.
Utilisez des sous-requêtes ou des CTE pour réduire les volumes avant la jointure.
Ne joignez que les tables strictement nécessaires. Chaque JOIN ajoute de la complexité.
INNER JOIN est généralement plus rapide car il exclut les non-correspondances.
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.
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.
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é.
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.
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.
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.
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.
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 :