Lezioni del modulo (1/4)
JOIN su tre o più tabelle
Nel Modulo 3 hai unito due tabelle. Nel mondo reale i dati sono quasi
sempre sparsi su tre o più tabelle collegate da chiavi esterne: per
rispondere a una domanda di business devi attraversare la catena di
relazioni. È esattamente ciò che fa un JOIN multiplo.
Da questo modulo in poi useremo il dataset ecommerce (clienti,
categorie, prodotti, ordini, righe d'ordine, recensioni). Puoi esplorarlo dal
Playground selezionando ecommerce dal selettore di
dataset.
La sintassi: una catena di 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 …]
…;Ogni JOIN aggiunge un "anello" alla catena: il motore prende il risultato
intermedio dei JOIN precedenti e gli accosta la tabella successiva.
-- 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;Tre JOIN, quattro tabelle. Il risultato ha una riga per ogni order_items —
ogni prodotto in ogni ordine — arricchita con email cliente e nome prodotto.
L'ordine logico
Il motore unisce le tabelle da sinistra a destra. La condizione di un
JOIN può riferire qualunque tabella già introdotta sopra. Per leggibilità:
- metti per prima la "tabella principale" della domanda (qui
orders); - aggiungi le altre nell'ordine in cui le visiti seguendo le relazioni.
Aggregati su catene di JOIN
I JOIN multipli si combinano con GROUP BY per produrre report:
-- 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;Non hai bisogno di JOIN products qui: tutto quello che ti serve
(quantity, unit_price) è già in order_items. Regola pratica: non
aggiungere tabelle che non usi — peggiorano performance e leggibilità.
Prova tu
Per ogni riga d'ordine degli ordini consegnati (status = 'delivered'), mostra email del cliente, nome del prodotto e quantità. Tre colonne. Ordina per id ordine crescente e id prodotto crescente.
Mostra suggerimento
Tre JOIN: orders→customers su customer_id, orders→order_items su order_id, order_items→products su product_id.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Top 3 clienti per spesa totale (somma di quantity * unit_price) sui soli ordini consegnati. Due colonne: email e total. Ordina per total decrescente, limita a 3.
Mostra suggerimento
Non ti serve JOIN products: quantity e unit_price sono già in order_items.
Soluzione disponibile dopo 3 tentativi