SQL Quest
Se connecter English 0 XP Niv. 1
Intermédiaire

SQL INNER JOIN : relier deux tables

5 min de lecture · 4 exemples exécutables · mis à jour le 9 octobre 2026

Dans une base de données bien conçue, les informations sont réparties dans plusieurs tables : les commandes d'un côté, les clients de l'autre. Pour afficher « la commande n°12 a été passée par Léa Martin », il faut relier ces tables. C'est ce que fait une jointure, et INNER JOIN (ou simplement JOIN) est la plus courante.

Syntaxe

SELECT a.colonne, b.colonne
FROM table_a a
JOIN table_b b ON b.cle = a.cle_etrangere;

Comment ça marche

Clé primaire et clé étrangère

Chaque client a un identifiant unique, sa clé primaire : clients.id. Dans la table commandes, la colonne client_id contient l'identifiant du client qui a passé la commande : c'est une clé étrangère. La jointure associe les lignes où commandes.client_id = clients.id.

Comment fonctionne INNER JOIN

Pour chaque ligne de la première table, SQL cherche les lignes de la seconde qui respectent la condition ON, et construit une ligne de résultat pour chaque correspondance. Une ligne sans correspondance disparaît du résultat : c'est la différence avec LEFT JOIN.

Les alias de tables

FROM commandes o JOIN clients c donne les surnoms o et c aux tables. On écrit ensuite c.nom ou o.id : c'est plus court, et indispensable quand deux tables ont une colonne du même nom.

Enchaîner les jointures

On peut ajouter autant de JOIN que nécessaire. Par exemple : lignes de commande → produits → fournisseurs.

Schéma

commandes
idclient_id
11
22
39
clients
idprenom
1Léa
2Hugo
3Inès
résultat
commandeprenom
1Léa
2Hugo
commandes JOIN clients ON clients.id = commandes.client_id : chaque commande récupère les informations de son client. La commande 3 (client 9, inexistant) disparaît.

Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).

Exemples avec leurs résultats

1. Une jointure simple

Chaque commande avec le prénom et le nom du client.

SELECT o.id AS commande, o.date_commande, c.prenom, c.nom
FROM commandes o
JOIN clients c ON c.id = o.client_id
LIMIT 6;
Essayer dans le bac à sable
Résultat
commandedate_commandeprenomnom
12023-06-02ChloéMercier
22025-10-17OmarLambert
32024-05-10SarahLambert
42025-02-08LéaLefebvre
52025-09-06ManonGarcia
62024-01-11InèsHaddad

6 lignes au total

2. Joindre pour filtrer

Les commandes annulées des clients de Lyon.

SELECT o.id, c.prenom, c.nom, o.date_commande
FROM commandes o
JOIN clients c ON c.id = o.client_id
WHERE o.statut = 'annulée' AND c.ville = 'Lyon';
Essayer dans le bac à sable
Résultat
idprenomnomdate_commande
13InèsGarcia2024-06-02
138ThéoMartin2023-12-01
153ThéoDubois2023-06-01
174ThéoMichel2024-03-10
210ThéoMartin2023-10-20
348ChloéFontaine2025-04-15
358SarahMichel2025-08-15
368ThéoMichel2024-05-13
430SamirFaure2023-07-22
500ThéoMichel2023-07-03

14 lignes au total · 10 affichées

3. Trois tables et un GROUP BY

Le chiffre d'affaires par catégorie de produit.

SELECT p.categorie, ROUND(SUM(l.quantite * l.prix_unitaire), 2) AS ca
FROM lignes_commande l
JOIN produits p ON p.id = l.produit_id
GROUP BY p.categorie
ORDER BY ca DESC;
Essayer dans le bac à sable
Résultat
categorieca
Informatique151 080
Maison31 502,56
Sport26 397,45
Alimentation20 224,32
Livres12 755,42

5 lignes au total

4. Une chaîne de jointures

Les produits avec le pays de leur fournisseur.

SELECT p.nom AS produit, f.nom AS fournisseur, f.pays
FROM produits p
JOIN fournisseurs f ON f.id = p.fournisseur_id
ORDER BY f.pays
LIMIT 8;
Essayer dans le bac à sable
Résultat
produitfournisseurpays
Souris sans filElectroPlusAllemagne
SSD 1ToElectroPlusAllemagne
Roman policierBookWorldBelgique
Haltères 5kgAsiaPartsChine
Corde à sauterAsiaPartsChine
Manga tome 1AsiaPartsChine
Écran 27"SportZoneEspagne
Hub USB-CSportZoneEspagne

8 lignes au total

Les erreurs fréquentes

Oublier la condition ON

Sans ON, chaque commande est associée à chaque client (produit cartésien) : 600 × 120 = 72 000 lignes.

À éviter
SELECT * FROM commandes o JOIN clients c;
Correct
SELECT * FROM commandes o JOIN clients c ON c.id = o.client_id;

Relier les mauvaises colonnes

c.id = o.id associe la commande n°5 au client n°5, sans aucun rapport. La requête marche mais le résultat est faux.

À éviter
SELECT * FROM commandes o JOIN clients c ON c.id = o.id;
Correct
SELECT * FROM commandes o JOIN clients c ON c.id = o.client_id;

Colonne ambiguë

Les deux tables ont une colonne id : SQL ne sait pas laquelle afficher (ambiguous column name). Préfixez-la avec l'alias.

À éviter
SELECT id, nom FROM commandes o JOIN clients c ON c.id = o.client_id;
Correct
SELECT o.id, c.nom FROM commandes o JOIN clients c ON c.id = o.client_id;

Exercices

Essayez d'écrire la requête vous-même avant d'ouvrir la solution.

Défi 1. Affichez chaque ligne de commande avec le nom du produit et la quantité.

Voir une solution
SELECT l.commande_id, p.nom, l.quantite FROM lignes_commande l JOIN produits p ON p.id = l.produit_id LIMIT 10;
commande_idnomquantite
1BD aventure5
1Gourde inox5
2Vase céramique2
3Haltères 5kg2
4Écran 27"4
4Thé vert4
4Corde à sauter4
4Cafetière4

10 lignes au total · 8 affichées

Essayer dans le bac à sable

Défi 2. Affichez le nombre de commandes gérées par chaque employé (prénom, nom, nombre).

Voir une solution
SELECT e.prenom, e.nom, COUNT(*) AS nb FROM commandes o JOIN employes e ON e.id = o.employe_id GROUP BY e.id ORDER BY nb DESC;
prenomnomnb
SamirRoux49
InèsMercier37
KarimBenali35
LéaGarcia33
LouisChevalier33
LucasMoreau32
ChloéRoux31
EmmaLambert31

21 lignes au total · 8 affichées

Essayer dans le bac à sable
Envie de vous entraîner davantage ?

Les exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.

Faire les exercices interactifs

Questions fréquentes

JOIN et INNER JOIN, c'est pareil ?

Oui. INNER est implicite : JOIN tout court est une jointure interne.

Peut-on mettre la condition dans le WHERE plutôt que dans ON ?

Pour un INNER JOIN, le résultat est le même (c'est l'ancienne syntaxe FROM a, b WHERE a.x = b.y). Avec ON, la requête est plus lisible, et c'est indispensable pour les LEFT JOIN.

Pourquoi ma jointure donne-t-elle plus de lignes que prévu ?

Parce qu'une ligne peut avoir plusieurs correspondances : une commande contient plusieurs lignes de commande, donc elle apparaît plusieurs fois. C'est normal pour une relation « un à plusieurs ».

Combien de tables peut-on joindre ?

Autant que nécessaire. Chaque JOIN ajoute une table avec sa propre condition ON.

À lire ensuite