Vai al contenuto
eLearner.app
Modulo 5 · Lezione 1 di 417/57 nel corso~12 min
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

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 …]
…;

Ogni JOIN aggiunge un "anello" alla catena: il motore prende il risultato intermedio dei JOIN precedenti e gli accosta la tabella successiva.

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;

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:

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;

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

Esercizio#sql.m5.l1.e1
Tentativi: 0Caricamento…

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.

Caricamento editor…
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

Esercizio#sql.m5.l1.e2
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Non ti serve JOIN products: quantity e unit_price sono già in order_items.

Soluzione disponibile dopo 3 tentativi