Join SQL spiegati, con un esempio per ciascuno

Un join combina le righe di due tabelle facendo corrispondere una colonna. Il tipo di join decide cosa succede alle righe che non trovano un partner. Tutti gli esempi usano il database della panetteria: 8 clienti e 12 ordini, due dei quali erano ordini al banco senza cliente.

INNER JOIN: solo le corrispondenze

Mantiene una riga solo quando entrambi i lati hanno una corrispondenza. Sia i clienti senza ordini sia gli ordini senza cliente scompaiono.

SELECT c.last_name, o.order_id
FROM customers AS c
INNER JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Risultato: 10 righe: gli ordini che appartengono a un cliente.

LEFT JOIN: mantieni tutto a sinistra

Mantiene ogni riga della tabella di sinistra. Dove la tabella di destra non ha corrispondenza, le sue colonne sono NULL. Filtrare con IS NULL trova le righe senza corrispondenza.

SELECT c.last_name, COUNT(o.order_id) AS orders
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
GROUP BY c.customer_id, c.last_name
ORDER BY c.customer_id;

Risultato: Tutti gli 8 clienti; Kim e Meyer mostrano 0 ordini.

RIGHT JOIN: mantieni tutto a destra

È l'immagine speculare di LEFT JOIN. Molte persone scambiano l'ordine delle tabelle e usano LEFT JOIN, che risulta più naturale.

SELECT o.order_id, c.last_name
FROM customers AS c
RIGHT JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Risultato: Tutti i 12 ordini; gli ordini 4 e 11 hanno un cognome NULL (clienti al banco).

FULL JOIN: mantieni tutto da entrambi i lati

Mantiene le righe senza corrispondenza di entrambe le tabelle. È utile per confrontare due elenchi e vedere cosa manca da una parte o dall'altra.

SELECT c.last_name, o.order_id
FROM customers AS c
FULL JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id, c.last_name;

Risultato: 14 righe: 10 corrispondenze, 2 ordini al banco e i clienti Kim e Meyer senza ordini.

CROSS JOIN: ogni combinazione

Abbina ogni riga della prima tabella con ogni riga della seconda. Il numero di righe è il prodotto dei due. Usalo di proposito, per esempio per costruire una griglia di date e categorie.

SELECT COUNT(*) AS combinations
FROM customers
CROSS JOIN products;

Risultato: 72, cioè 8 clienti per 9 prodotti.

Self join: una tabella con se stessa

Dai alla stessa tabella due alias per confrontare righe della stessa tabella, come due clienti della stessa città.

SELECT a.first_name AS first_customer, b.first_name AS second_customer, a.city
FROM customers AS a
JOIN customers AS b ON a.city = b.city AND a.customer_id < b.customer_id
ORDER BY a.city;

Risultato: Le coppie Emma e Hugo (Berlino), Ben e Dev (Londra), e Chloe e Farid (Parigi).

Domande comuni

Perché il mio join restituisce più righe di quelle che mi aspettavo?
Di solito la colonna del join non è univoca da un lato, quindi ogni riga corrisponde a più righe. Controlla le chiavi e verifica il numero di righe prima e dopo il join.
Fa differenza se una condizione è in ON o in WHERE?
Per un INNER JOIN non cambia nulla. Per un LEFT JOIN, una condizione sulla tabella di destra in WHERE elimina le righe senza corrispondenza e trasforma il LEFT JOIN in un INNER JOIN. Mettila in ON per mantenerle.
Quale join equivale a VLOOKUP?
Un LEFT JOIN: ogni riga della tabella principale viene mantenuta, e la colonna cercata è NULL dove non c'è corrispondenza, come #N/D. A differenza di VLOOKUP, restituisce tutte le corrispondenze, non solo la prima.

Esercitati