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.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 tableJOIN 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 villeSELECT c.prenom, v.nom AS ville
FROM clients c
LEFTJOIN 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
LEFTJOIN 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.
Publicité
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
Chaque produit (nom) avec le nom de sa catégorie
Chaque commande : son id, sa date et le prénom du client
Tous les clients (prénom) avec leur ville, y compris celui qui n'en a pas (NULL)
Les clients (prénom, nom) qui n'ont jamais commandé
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
LEFTJOIN clients c ON c.ville_id = v.id
GROUPBY 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
GROUPBY c.nom
ORDERBY ca DESC;