Skip to content

INNER JOIN – Jointure interne

Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 6 minutes


Dans le langage SQL, la commande INNER JOIN, aussi appelée EQUIJOIN, est un type de jointure très commun pour lier plusieurs tables entre elles. Cette commande retourne les enregistrements lorsqu’il y a au moins une ligne dans chaque colonne qui correspond à la condition.

Bon à savoir : INNER JOIN ne retourne que les lignes qui ont une correspondance dans les deux tables. Si une ligne d’une table n’a pas de correspondance dans l’autre table, elle n’apparaît pas dans le résultat.


Pour utiliser ce type de jointure, il convient d’utiliser une requête SQL avec cette syntaxe :

SELECT *
FROM table1
INNER JOIN table2 ON table1.id = table2.fk_id;

La syntaxe ci-dessus stipule qu’il faut sélectionner les enregistrements des tables table1 et table2 lorsque les données de la colonne id de table1 sont égales aux données de la colonne fk_id de table2.

La jointure peut aussi être écrite de la façon suivante :

SELECT *
FROM table1, table2
WHERE table1.id = table2.fk_id;

La syntaxe avec la condition WHERE est une manière alternative de faire la jointure mais qui possède l’inconvénient d’être moins facile à lire s’il y a déjà plusieurs conditions dans le WHERE.

Recommandation : Il est préférable d’utiliser la syntaxe explicite avec INNER JOIN pour une meilleure lisibilité, surtout pour les requêtes complexes.


Imaginons une application qui possède une table utilisateur ainsi qu’une table commande qui contient toutes les commandes effectuées par les utilisateurs.

Table « utilisateur » :

id prenom nom email ville
1 Aimée Marechal [email protected] Paris
2 Esmée Lefort [email protected] Lyon
3 Marine Prevost [email protected] Lille
4 Luc Rolland [email protected] Marseille

Table « commande » :

utilisateur_id date_achat num_facture prix_total
1 2013-01-23 A00103 203.14
1 2013-02-14 A00104 124.00
2 2013-02-17 A00105 149.45
2 2013-02-21 A00106 235.35
5 2013-03-02 A00107 47.58

Pour afficher toutes les commandes associées aux utilisateurs, il est possible d’utiliser la requête suivante :

SELECT utilisateur.id,
utilisateur.prenom,
utilisateur.nom,
commande.date_achat,
commande.num_facture,
commande.prix_total
FROM utilisateur
INNER JOIN commande ON utilisateur.id = commande.utilisateur_id;

Résultat :

id prenom nom date_achat num_facture prix_total
1 Aimée Marechal 2013-01-23 A00103 203.14
1 Aimée Marechal 2013-02-14 A00104 124.00
2 Esmée Lefort 2013-02-17 A00105 149.45
2 Esmée Lefort 2013-02-21 A00106 235.35

Observations :

  • Les utilisateurs 3 (Marine) et 4 (Luc) n’apparaissent pas car ils n’ont aucune commande.
  • La commande de l’utilisateur 5 (qui n’existe pas dans la table utilisateur) n’apparaît pas.
  • Seules les lignes qui ont une correspondance dans les deux tables sont retournées.

Utiliser des alias pour simplifier la requête

Section titled “Utiliser des alias pour simplifier la requête”

La même requête peut être simplifiée en utilisant des alias :

SELECT u.id, u.prenom, u.nom,
c.date_achat, c.num_facture, c.prix_total
FROM utilisateur u
INNER JOIN commande c ON u.id = c.utilisateur_id;

On peut enchaîner plusieurs INNER JOIN pour lier trois tables ou plus :

Schéma : utilisateurcommandeproduit

SELECT u.nom, u.prenom,
c.date_achat, c.num_facture,
p.nom AS produit_nom, p.prix
FROM utilisateur u
INNER JOIN commande c ON u.id = c.utilisateur_id
INNER JOIN commande_produit cp ON c.id = cp.commande_id
INNER JOIN produit p ON cp.produit_id = p.id;

On peut ajouter une condition WHERE après le INNER JOIN pour filtrer davantage :

SELECT u.id, u.nom, c.date_achat, c.prix_total
FROM utilisateur u
INNER JOIN commande c ON u.id = c.utilisateur_id
WHERE c.prix_total > 150;

Résultat :

id nom date_achat prix_total
1 Aimée 2013-01-23 203.14
2 Esmée 2013-02-21 235.35

Il est possible de joindre sur plusieurs colonnes en utilisant AND :

SELECT *
FROM historique_prix hp
INNER JOIN produit p
ON hp.produit_id = p.id
AND hp.date_effet = p.date_mise_a_jour;

INNER JOIN avec clause USING (MySQL, PostgreSQL, SQLite)

Section titled “INNER JOIN avec clause USING (MySQL, PostgreSQL, SQLite)”

Si les colonnes ont le même nom dans les deux tables, on peut utiliser USING pour simplifier la syntaxe :

SELECT *
FROM utilisateur
INNER JOIN commande USING (id);

Dans cet exemple, USING (id) est équivalent à ON utilisateur.id = commande.id.

Remarque : USING est supporté par MySQL, PostgreSQL, SQLite et Oracle (avec des nuances), mais pas par SQL Server.


Pour garantir de bonnes performances :

  1. Indexez les colonnes de jointure : les colonnes utilisées dans la clause ON doivent être indexées.
  2. Évitez les jointures sur des colonnes non indexées sur de grandes tables.
  3. Limitez les colonnes sélectionnées : préférez une liste explicite de colonnes à *.
  4. Filtrez tôt : utilisez WHERE pour réduire le nombre de lignes avant la jointure (le SGBD optimise automatiquement, mais c’est une bonne pratique).

INNER JOIN LEFT JOIN
Retourne uniquement les lignes correspondantes dans les deux tables Retourne toutes les lignes de la table de gauche + les correspondances
Les utilisateurs sans commande sont exclus Les utilisateurs sans commande apparaissent (avec des valeurs NULL pour les colonnes de commande)

Nous verrons LEFT JOIN en détail dans un prochain chapitre.


Erreur Cause Solution
Oubli de la condition ON Jointure sans condition Ajouter ON avec la condition appropriée
Colonne ambiguë (error: ambiguous column) Le nom de colonne existe dans plusieurs tables Préfixer la colonne avec le nom de la table
Syntaxe incorrecte Ordre des mots-clés incorrect Vérifier l’ordre : SELECT ... FROM ... INNER JOIN ... ON ...

Vous savez désormais comment utiliser INNER JOIN pour lier deux tables en ne gardant que les correspondances. Mais que faire si vous souhaitez associer chaque ligne d’une table avec chaque ligne d’une autre table ?

👉 Chapitre 33 : CROSS JOIN – Jointure cartésienne


Bonne continuation !
Junior TSAFACK – 08/08/2026