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
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.
-- 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 :
-- 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
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.
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
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.
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