Leçon 5.8 : Scénarios et techniques pratiques de JOIN
Nous avons vu les mécanismes des différents types de jointures. Dans cette leçon, nous allons au-delà des bases et voir comment appliquer les joins pour résoudre des problèmes métier courants, gérer plusieurs tables et combiner les joins avec l'agrégation.
1. Joindre plusieurs tables (3+)
Dans les bases complexes, les données sont souvent réparties sur trois tables ou plus, reliées par des tables de liaison.
Scénario : Voir la liste des acteurs et les titres des films dans lesquels ils ont joué.
Cela nécessite trois tables : actor, film_actor (la table de liaison), et film.
SELECT
a.first_name,
a.last_name,
f.title
FROM
actor AS a
INNER JOIN
film_actor AS fa ON a.actor_id = fa.actor_id
INNER JOIN
film AS f ON fa.film_id = f.film_id
ORDER BY
a.last_name
LIMIT 10;
Explication :
- Chaque
JOINcrée une nouvelle table virtuelle pour la jointure suivante. - L'ordre des joins suit généralement le chemin des relations dans le diagramme de la base.
2. Utiliser les fonctions d'agrégation avec JOIN
Les joins sont puissants pour calculer des statistiques sur des tables liées. Utilisez COUNT, SUM, AVG après la jointure.
Scénario : Calculer le montant total dépensé par chaque client.
SELECT
c.first_name,
c.last_name,
SUM(p.amount) AS total_depense
FROM
customer AS c
INNER JOIN
payment AS p ON c.customer_id = p.customer_id
GROUP BY
c.customer_id, c.first_name, c.last_name
ORDER BY
total_depense DESC;
Note : Avec GROUP BY, incluez toujours la clé primaire (customer_id) pour garantir l'unicité si deux clients ont le même nom.
3. Trouver les données manquantes (Anti-Join)
Utilisez LEFT JOIN avec une clause WHERE pour trouver les enregistrements sans correspondance dans une autre table.
Scénario : Trouver tous les films qui ne sont pas en stock (pas de copie physique).
SELECT
f.title
FROM
film AS f
LEFT JOIN
inventory AS i ON f.film_id = i.film_id
WHERE
i.inventory_id IS NULL;
4. Piège du filtre : WHERE vs ON
Erreur fréquente : mettre un filtre dans WHERE lors d'un LEFT JOIN, ce qui le transforme en INNER JOIN.
Incorrect :
-- Cela supprime les clients sans paiement car p.payment_date est filtré après la jointure
SELECT c.last_name, p.amount
FROM customer c
LEFT JOIN payment p ON c.customer_id = p.customer_id
WHERE p.payment_date > '2005-08-01';
Correct (conserve tous les clients) :
-- Cela conserve tous les clients et ne joint que les paiements correspondant à la date
SELECT c.last_name, p.amount
FROM customer c
LEFT JOIN payment p ON c.customer_id = p.customer_id
AND p.payment_date > '2005-08-01';
Points clés de cette leçon
- Enchaînement des joins : Ajoutez autant de
JOINque nécessaire. - Reporting : Combinez
JOINetGROUP BYpour des rapports complexes. - Audit de données : Utilisez
LEFT JOIN ... WHERE ... IS NULLpour trouver les lacunes. - Précision logique : Faites attention à l'emplacement des filtres (
ONvsWHERE) avec les joins externes.