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.
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 :
JOIN crée une nouvelle table virtuelle pour la jointure suivante.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.
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;
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';
JOIN que nécessaire.JOIN et GROUP BY pour des rapports complexes.LEFT JOIN ... WHERE ... IS NULL pour trouver les lacunes.ON vs WHERE) avec les joins externes.