Passer au contenu principal
eLearner.app
Module 5 · Leçon 1 sur 417/57 dans le cours~12 min
Leçons du module (1/4)

JOINs sur trois tables ou plus

Dans le module 3, vous avez rejoint deux tables. Dans le monde réel, les données sont presque toujours dispersés sur trois tables ou plus liées par des clés étrangères : pour Pour répondre à une question commerciale, vous devez parcourir la chaîne des relations. C'est exactement ce que fait un JOIN multi-table.

À partir de ce module, nous utiliserons l'ensemble de données ecommerce (clients, catégories, produits, commandes, articles de commande, avis). Vous pouvez l'explorer à partir de le Playground en sélectionnant ecommerce dans l'ensemble de données cueilleur.

La syntaxe : une chaîne de JOIN

SQL
SELECT colonne
FROM   tabella_a
JOIN   tabella_b ON tabella_a.x = tabella_b.y
JOIN   tabella_c ON tabella_b.z = tabella_c.w
[JOIN  tabella_d ON …]
…;

Chaque JOIN ajoute un "maillon" à la chaîne : le moteur prend le relais intermédiaire résultat des JOIN précédentes et y attache la table suivante.

SQL
-- Per ogni riga d'ordine: cliente, prodotto e quantità.
SELECT c.email,
       p.name AS prodotto,
       oi.quantity
FROM   orders      AS o
JOIN   customers   AS c  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
JOIN   products    AS p  ON oi.product_id = p.id;

Trois JOIN, quatre tableaux. Le résultat a une ligne par order_items — chacun produit dans chaque commande - enrichi de l'e-mail du client et du nom du produit.

L'ordre logique

Le moteur rejoint les tables de gauche à droite. Une condition JOIN peut faites référence à n’importe quel tableau déjà présenté ci-dessus. Pour plus de lisibilité :

  • mettre en premier le "tableau principal" de la question (ici orders) ;
  • ajoutez les autres dans l'ordre dans lequel vous les visitez en suivant les relations.

Agrégats sur les chaînes JOIN

Plusieurs JOIN se combinent avec GROUP BY pour produire des rapports :

SQL
-- Spesa totale per cliente (solo ordini consegnati):
SELECT c.email,
       SUM(oi.quantity * oi.unit_price) AS total
FROM   customers   AS c
JOIN   orders      AS o  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
WHERE  o.status = 'delivered'
GROUP BY c.email
ORDER BY total DESC;

Vous n'avez pas besoin de JOIN products ici : tout ce dont vous avez besoin (quantity, unit_price) est déjà dans order_items. Règle générale : **n'ajoutez pas de tableaux vous n'utilisez pas ** - ils nuisent aux performances et à la lisibilité.

Essayez-le vous-même

Exercice#sql.m5.l1.e1
Tentatives : 0Chargement…

Pour chaque commande de l'ordre consegnati (statut = 'livré'), affiche l'e-mail du client, le nom du produit et la quantité. Trois colonnes. Ordina per id ordine crescente et id prodotto crescente.

Chargement de l'éditeur…
Afficher l'indice

Trois JOIN : commandes → clients sur customer_id, commandes → order_items sur order_id, order_items → produits sur product_id.

Solution disponible après 3 tentatives

Exercice de révision

Exercice#sql.m5.l1.e2
Tentatives : 0Chargement…

Top 3 clients par spesa total (somma di quantité * unit_price) sui soli ordini consegnati. Colonne due : email et total. Ordina per total décroissante, limite à 3.

Chargement de l'éditeur…
Afficher l'indice

Ne pas servir les produits JOIN : quantité et prix unitaire sont indiqués dans order_items.

Solution disponible après 3 tentatives