Aller au contenu
M06 · C. Manipuler les données

Les jointures : INNER, LEFT, RIGHT, auto-jointure

Recoller les informations rangées dans plusieurs tables avec JOIN ... ON, garder les lignes sans correspondance avec LEFT et RIGHT JOIN, et joindre une table à elle-même.

1Situer

La normalisation a rangé chaque information à un seul endroit : le nom du client dans clients, la date dans commandes, le nom du produit dans produits. Très bien pour la cohérence... mais pour afficher « Amina a commandé un tajine le 5 janvier », il faut aller chercher dans trois tables à la fois. Les jointures recollent les morceaux grâce aux clés étrangères.

2Comprendre

JOIN et LEFT JOIN : rapprocher deux tables
clients c Amina · ville 1 Hiba · ville 2 Mehdi · NULL villes v 1 · Fès 2 · Safi 3 · Agadir ? … Amina · Fès Hiba · Safi Mehdi · NULL Agadir n'a pas de client ici : elle n'apparaît pas non plus.

clients.ville_id pointe vers villes.id. Mehdi n'a pas de ville (NULL).

1 / 4

L’équi-jointure : JOIN … ON

SELECT c.prenom, c.nom, v.nom AS ville
FROM clients c                       -- c : alias (surnom) de la table
JOIN villes v ON v.id = c.ville_id;  -- la clé étrangère rejoint la clé primaire

Quand deux tables ont une colonne du même nom (nom, id), on préfixe par la table ou son alias : c.nom, v.nom.

Les jointures externes : LEFT et RIGHT JOIN

-- Tous les clients, même Mehdi qui n'a pas de ville
SELECT c.prenom, v.nom AS ville
FROM clients c
LEFT JOIN villes v ON v.id = c.ville_id;

A RIGHT JOIN B donne le même résultat que B LEFT JOIN A. En pratique, on écrit presque toujours LEFT JOIN en mettant la table « principale » à gauche.

L’auto-jointure

SELECT e.nom AS employe, chef.nom AS chef
FROM employes e
LEFT JOIN employes chef ON chef.id = e.chef_id;
Exemple simple

Les deux listes de la classe

Une liste donne « numéro → nom de l'élève », une autre « numéro → note ». Pour afficher le nom à côté de la note, on rapproche les lignes qui ont le même numéro. C'est une jointure.

SELECT e.nom, n.note
FROM eleves e
JOIN notes n ON n.num_eleve = e.num;
Exemple simple

LEFT JOIN : personne n'est oublié

Avec JOIN, un élève sans note disparaît du résultat. Avec LEFT JOIN, il reste, et sa note est vide (NULL). Pratique pour trouver les absents.

3Manipuler

Répondez avec des jointures. Les alias (c pour clients, o pour commandes...) raccourcissent l'écriture. Ouvrez le lab pour voir chaque jointure se construire.
Pas à pas dans le lab ↗ La base de départ se crée dans votre navigateur (moteur SQL d’environ 700 Ko, chargé une fois).
Résultat

Le résultat de chaque requête s'affichera ici.

Consignes 0 / 5

  1. Chaque produit (nom) avec le nom de sa catégorie
  2. Chaque commande : son id, sa date et le prénom du client
  3. Tous les clients (prénom) avec leur ville, y compris celui qui n'en a pas (NULL)
  4. Les clients (prénom, nom) qui n'ont jamais commandé
  5. Chaque employé (nom) avec le nom de son chef (auto-jointure, la directrice comprise)

4Pratiquer

Exercice 1 · Trois tables

Pour la commande 9, affichez le nom de chaque produit, la quantité et le montant de la ligne (quantité × prix unitaire).

Voir le corrigé
SELECT p.nom, l.quantite, l.quantite * l.prix_unitaire AS montant
FROM lignes_commande l
JOIN produits p ON p.id = l.produit_id
WHERE l.commande_id = 9;

Exercice 2 · Jointure et regroupement

Le nombre de clients par nom de ville, villes sans client comprises (0).

Voir le corrigé
SELECT v.nom, COUNT(c.id) AS nb_clients
FROM villes v
LEFT JOIN clients c ON c.ville_id = v.id
GROUP BY v.nom;
-- COUNT(c.id) et pas COUNT(*) : sinon une ville sans client compte 1

Exercice 3 · Le chiffre d'affaires par catégorie

Pour chaque nom de catégorie, la somme des quantité × prix unitaire vendus.

Voir le corrigé
SELECT c.nom, SUM(l.quantite * l.prix_unitaire) AS ca
FROM categories c
JOIN produits p ON p.categorie_id = c.id
JOIN lignes_commande l ON l.produit_id = p.id
GROUP BY c.nom
ORDER BY ca DESC;

5Vérifier

1. Mehdi n'a pas de ville (ville_id NULL). Avec clients JOIN villes ON ..., que devient-il ?
2. Que se passe-t-il si on oublie la condition ON ?
3. Une auto-jointure, c'est...