Code SQL copié dans le presse-papiers
Maîtrisez les scénarios pratiques de JOIN en SQL pour résoudre des problèmes d'analyse de données. Cette leçon couvre la jointure de plusieurs tables, l'utilisation des fonctions d'agrégation avec JOIN pour le reporting, et l'identification des données manquantes. Apprenez à combiner JOIN et GROUP BY pour extraire des insights approfondis de la base Sakila.
RU EN PT

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 JOIN cré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 JOIN que nécessaire.
  • Reporting : Combinez JOIN et GROUP BY pour des rapports complexes.
  • Audit de données : Utilisez LEFT JOIN ... WHERE ... IS NULL pour trouver les lacunes.
  • Précision logique : Faites attention à l'emplacement des filtres (ON vs WHERE) avec les joins externes.