SQL JOIN spiegati con esempi (Inner, Left, Right, Full)
Impara i JOIN INNER, LEFT, RIGHT, FULL, CROSS e SELF con due piccole tabelle, query chiare e i risultati esatti.
- INNER JOIN: solo le righe che corrispondono in entrambe le tabelle.
- LEFT JOIN: tutte le righe di sinistra, con le corrispondenze (NULL se mancano).
- RIGHT JOIN: tutte le righe di destra, con le corrispondenze.
- FULL JOIN: tutte le righe di entrambe le tabelle, abbinate quando possibile.
- Collega tramite chiavi, usa alias di tabella e indicizza le colonne del join.
I database reali non mettono tutto in una sola tabella. I clienti stanno in una tabella e gli ordini in un’altra. Per rispondere a “quali clienti hanno ordinato questo mese?” bisogna combinarle, ed è ciò che fanno i JOIN SQL.
Questa guida è pratica. I join confondono i principianti perché le stesse due tabelle danno risultati diversi a seconda del tipo di join. Con dati piccoli e concreti diventano semplici.
SQL JOIN spiegati: tabelle di esempio
customers
| id | name |
|---|---|
| 1 | Asha |
| 2 | Ben |
| 3 | Chitra |
orders
| id | customer_id | total |
|---|---|---|
| 101 | 1 | 250 |
| 102 | 1 | 120 |
| 103 | 2 | 90 |
| 104 | 9 | 40 |
Chitra non ha ordini e l’ordine 104 punta a un cliente (9) che non esiste. Questi due casi limite mostrano la differenza tra i tipi di join.
INNER JOIN
INNER JOIN restituisce solo le righe in cui la condizione è vera in entrambe le tabelle. Le righe senza corrispondenza vengono scartate.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
Risultato: Asha (101), Asha (102), Ben (103). Chitra e l’ordine 104 mancano. Usalo quando contano solo i dati correlati, come gli ordini con i dettagli del cliente. Scrivere solo JOIN equivale a INNER JOIN.
LEFT JOIN
LEFT JOIN mantiene tutte le righe della tabella di sinistra e aggiunge quelle corrispondenti di destra. Dove non c’è corrispondenza, le colonne di destra sono NULL.
SELECT c.name, o.id AS order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
Risultato: Asha (101), Asha (102), Ben (103), Chitra (NULL, NULL). Ora Chitra compare.
Consiglio rapido: per trovare i clienti che non hanno mai ordinato, filtra il NULL a destra: WHERE o.id IS NULL restituisce Chitra. I tester lo usano per trovare record orfani o mancanti.
RIGHT JOIN e FULL JOIN
RIGHT JOIN è lo specchio di LEFT JOIN e mantiene tutte le righe di destra. La maggior parte inverte l’ordine delle tabelle e usa LEFT JOIN, più naturale da leggere.
SELECT c.name, o.id AS order_id
FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;
Il risultato include l’ordine 104 con nome cliente NULL. FULL (OUTER) JOIN restituisce tutte le righe di entrambe le tabelle: Chitra senza ordine e l’ordine 104 senza cliente.
SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.id;
PostgreSQL e SQL Server lo supportano. MySQL no: combina LEFT JOIN e RIGHT JOIN con UNION. Per approfondire, il manuale di PostgreSQL ha un chiaro tutorial sui join.
| Join | Solo righe di sinistra | Solo righe di destra | Righe corrispondenti |
|---|---|---|---|
| INNER | No | No | Sì |
| LEFT | Sì | No | Sì |
| RIGHT | No | Sì | Sì |
| FULL | Sì | Sì | Sì |
CROSS JOIN e SELF JOIN
CROSS JOIN abbina ogni riga di una tabella a ogni riga dell’altra: tre clienti e quattro ordini danno dodici righe. È raro, ma utile per generare combinazioni, come dati di test per ogni taglia e colore.
SELECT c.name, o.id
FROM customers c
CROSS JOIN orders o;
SELF JOIN unisce una tabella a se stessa tramite alias, ad esempio per trovare il responsabile di ogni dipendente.
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
SQL JOIN: errori comuni e consigli sulle prestazioni
- Dimenticare la clausola ON crea per errore un CROSS JOIN e fa esplodere il numero di righe.
- Filtrare la tabella di destra nel WHERE dopo un LEFT JOIN lo trasforma in INNER JOIN; metti la condizione nell’ON.
- Nomi di colonna ambigui: prefissa le colonne con l’alias della tabella.
- Join su colonne non univoche moltiplica le righe e gonfia i totali.
- Indicizza le colonne del join, seleziona solo le colonne necessarie e analizza le query lente con
EXPLAIN.
Perché i join contano per i tester
Gli ingegneri QA usano i join per verificare che i dati creati da UI o API arrivino correttamente nel database e per trovare record orfani. Leggi insieme la nostra guida al test delle API con Postman (in inglese). Per le basi vedi il tutorial SQL per principianti (in inglese) e, per i nuovi archivi di dati, i database vettoriali (in inglese). Per eseguire un database in locale, consulta il tutorial Docker (in inglese).
Considerazioni finali
I JOIN SQL in una riga: INNER tiene solo le corrispondenze, LEFT tutto a sinistra, RIGHT tutto a destra, FULL tiene tutto. Esercitati con due piccole tabelle finché non prevedi il risultato prima di eseguire la query; poi unisci tre tabelle e combina i join con GROUP BY.
Domande frequenti
Qual è la differenza tra INNER JOIN e LEFT JOIN?
INNER JOIN restituisce solo le righe corrispondenti di entrambe le tabelle. LEFT JOIN restituisce tutte le righe della tabella di sinistra e riempie con NULL le colonne di destra senza corrispondenza.
Quale JOIN SQL è il più veloce?
Nessun tipo è sempre il più veloce. Le prestazioni dipendono da indici, dimensione delle tabelle e piano di esecuzione. Indicizza le colonne del join e controlla il piano.
MySQL supporta FULL OUTER JOIN?
No. In MySQL combina LEFT JOIN e RIGHT JOIN con UNION per ottenere lo stesso risultato.
A cosa serve un SELF JOIN?
Un SELF JOIN confronta righe della stessa tabella, ad esempio per trovare il responsabile di ogni dipendente in un’unica tabella employees.
Perché il mio join restituisce righe duplicate?
I duplicati compaiono quando la colonna del join non è univoca in una delle tabelle. Controlla le chiavi o aggrega i dati prima del join.
Continua a imparare (articoli in inglese)
Ti serve aiuto con test, WordPress o SEO?
Aiutiamo i team a rilasciare software migliore e a far crescere i loro siti. Raccontaci su cosa lavori e ti suggeriremo il prossimo passo.