Leçon 7 / 8
Leçon 07 · Partie 2 — Modifier et relier

Jointures — relier deux tables

Le problème : les données sont séparées

On a une table clients et une table commandes. Pour afficher le nom du client avec ses commandes, il faut relier les deux tables. C'est exactement ce que font les jointures (JOIN).

💡

Une jointure combine les colonnes de deux tables en une seule requête. Le résultat est une table virtuelle qui contient des données des deux sources.

INNER JOIN : l'intersection

INNER JOIN renvoie uniquement les lignes qui ont une correspondance dans les deux tables. Si un client n'a aucune commande, il n'apparaît pas. Si une commande n'a pas de client valide, elle n'apparaît pas.

-- Afficher chaque commande avec le nom du client
SELECT
  clients.nom,
  commandes.id AS commande_id,
  commandes.montant
FROM commandes
INNER JOIN clients ON commandes.client_id = clients.id;

La clause ON indique la condition de jointure : "la colonne client_id dans commandes doit correspondre à id dans clients". C'est exactement le lien que définissait la FOREIGN KEY de la leçon précédente.

Les alias de tables : simplifier l'écriture

Écrire commandes.client_id à chaque fois est long. On utilise des alias courts pour les tables.

-- c = clients, cmd = commandes
SELECT
  c.nom,
  c.ville,
  cmd.montant,
  cmd.date_commande
FROM commandes AS cmd
INNER JOIN clients AS c ON cmd.client_id = c.id;

LEFT JOIN : tout conserver à gauche

LEFT JOIN renvoie toutes les lignes de la table de gauche (celle dans FROM), même si elles n'ont pas de correspondance dans la table de droite. Les colonnes de droite seront NULL pour ces lignes.

-- Tous les clients, avec leurs commandes si elles existent
SELECT
  c.nom,
  cmd.montant
FROM clients AS c
LEFT JOIN commandes AS cmd ON c.id = cmd.client_id;

Les clients qui n'ont jamais commandé apparaissent quand même — avec NULL dans la colonne montant. Pratique pour trouver "les clients sans commande" :

-- Clients qui n'ont JAMAIS commandé
SELECT c.nom
FROM clients AS c
LEFT JOIN commandes AS cmd ON c.id = cmd.client_id
WHERE cmd.id IS NULL;

Comparaison visuelle des JOIN

📊 INNER JOIN vs LEFT JOIN

INNER JOIN

Seulement les lignes qui ont une correspondance dans les deux tables.
Clients sans commande → exclus.
Commandes sans client → exclues.

LEFT JOIN

Toutes les lignes de la table de gauche.
Correspondances de droite si elles existent, sinon NULL.
Clients sans commande → inclus avec NULL.

JOIN avec WHERE et ORDER BY

Les jointures se combinent avec toutes les clauses vues avant.

-- Commandes de plus de 50€ avec le nom du client, triées par montant
SELECT
  c.nom,
  cmd.montant,
  cmd.date_commande
FROM commandes AS cmd
INNER JOIN clients AS c ON cmd.client_id = c.id
WHERE cmd.montant > 50
ORDER BY cmd.montant DESC;
// À retenir
  • Un JOIN relie deux tables via une condition ON table1.col = table2.col
  • INNER JOIN — seulement les lignes qui ont une correspondance dans les deux tables
  • LEFT JOIN — toutes les lignes de gauche, correspondances de droite ou NULL
  • Les alias de tables (AS c, AS cmd) simplifient l'écriture
  • On peut combiner JOIN avec WHERE, ORDER BY, GROUP BY
  • WHERE col IS NULL après LEFT JOIN = trouver les lignes sans correspondance