SQL INNER JOIN : combiner deux tables liées
En SQL avec INNER JOIN, vous obtenez uniquement les lignes pour lesquelles la condition de jointure correspond dans les deux tables. Utilisez-le pour combiner des données liées, par exemple en rattachant des enregistrements à leurs valeurs de référence, quand les lignes sans correspondance doivent être exclues du résultat. Comme les deux côtés doivent satisfaire le prédicat de jointure, toute ligne avec une clé de jointure NULL ou sans correspondance est automatiquement filtrée.
Exemple SQL INNER JOIN pour combiner des tables liées
Sortie :
La sortie apparaîtra ici...
Sortie :
+---------+-------------+
| employe | departement |
+---------+-------------+
| Alma | Ingénierie |
| Ben | Ingénierie |
| Cara | Ventes |
+---------+-------------+
3 row(s)
Comment cet exemple fonctionne
departementscontient trois départements ;employescontient quatre personnes, chacune avec une clé étrangèreid_dept. La valeurid_deptde Dan est NULL.INNER JOIN departements d ON d.id = e.id_deptassocie chaque ligne employé à la ligne département dontidest égal àid_deptde l’employé. Seules les paires où les deux côtés correspondent sont conservées.- Dan a
id_dept = NULL. L’opérateur=renvoie inconnu quand l’un des opérandes est NULL, donc Dan ne correspond à aucun département et est exclu. - Le département RH (id 3) n’a aucun employé qui pointe vers lui, donc il n’apparaît pas non plus : INNER JOIN supprime les lignes sans correspondance des deux côtés.
Qu’est-ce que SQL INNER JOIN ?
INNER JOIN produit l’intersection de deux tables selon un prédicat de jointure. Logiquement, il conserve uniquement les paires de lignes pour lesquelles la condition ON est vraie. L’exécution physique varie selon le moteur et la forme des données (nested loops, hash join, merge join), mais le jeu de résultats contient toujours uniquement des lignes correspondantes.
INNER JOIN vs LEFT JOIN
| INNER JOIN | LEFT JOIN |
|---|---|
| Renvoie uniquement les lignes correspondantes des deux tables | Renvoie toutes les lignes de la table de gauche, avec des NULL lorsqu’aucune correspondance n’existe |
| Les lignes sans correspondance sont supprimées silencieusement | Les lignes sans correspondance à gauche sont conservées avec des colonnes de droite remplies avec NULL |
| À utiliser quand une correspondance manquante signifie des données invalides | À utiliser quand vous devez voir tous les enregistrements de gauche, avec ou sans correspondance |
Règle : choisissez INNER JOIN quand chaque ligne du résultat doit contenir des données valides des deux tables. Passez à LEFT JOIN quand vous devez conserver des lignes même sans correspondance à droite.
Erreurs courantes avec SQL INNER JOIN
Prédicat de jointure manquant ou toujours vrai
Omettre la clause ON (ou utiliser une condition toujours vraie) produit un produit cartésien : chaque employé est associé à chaque département.
-- Faux : produit cartésien (12 lignes de 4 × 3)
SELECT * FROM employes, departements;
-- Correct : prédicat de jointure explicite
SELECT * FROM employes e
INNER JOIN departements d ON d.id = e.id_dept;
Clés de jointure non uniques qui multiplient les lignes
INNER JOIN renvoie une ligne de sortie par paire correspondante. Si vous joignez une table où la clé n’est pas unique, une ligne à gauche peut correspondre à plusieurs lignes à droite et multiplier vos résultats.
INNER JOIN vs EXISTS
Utilisez INNER JOIN quand vous avez besoin de colonnes des deux tables dans la sortie. Utilisez EXISTS quand vous devez seulement filtrer des lignes selon la présence d’une ligne liée. EXISTS évite aussi la multiplication des lignes si la sous-requête peut correspondre à plusieurs lignes, et l’optimiseur peut souvent s’arrêter après la première correspondance.
-- EXISTS : une ligne par employé qui a un département correspondant
SELECT e.nom FROM employes e
WHERE EXISTS (SELECT 1 FROM departements d WHERE d.id = e.id_dept);
Notes de performance
Indexez les colonnes utilisées dans le prédicat de jointure (id_dept et departements.id ici). Sans index, le moteur peut balayer la table interne plusieurs fois. Pour les grandes tables, vérifiez le plan avec EXPLAIN QUERY PLAN : recherchez “USING INDEX” ou “SEARCH” plutôt que “SCAN”.