Join
Collegare tabelle diverse
Sezione intitolata “Collegare tabelle diverse”In un database relazionale, le informazioni non stanno sempre tutte nella stessa tabella.
Per esempio, potresti avere una tabella clienti e una tabella ordini. La prima contiene le persone. La seconda contiene gli acquisti.
Da sole mostrano informazioni parziali; insieme permettono di sapere chi ha comprato cosa.
Le JOIN collegano tabelle diverse mentre leggi i dati.
Un primo esempio
Sezione intitolata “Un primo esempio”Immagina queste due tabelle.
clienti
| id | nome |
|---|---|
| 1 | Luca |
| 2 | Marta |
| 3 | Sara |
ordini
| id | cliente_id | totale |
|---|---|---|
| 10 | 1 | 49.90 |
| 11 | 2 | 18.50 |
Nella tabella ordini, la colonna cliente_id dice a quale cliente appartiene ogni ordine.
Per mostrare il nome del cliente insieme al totale dell’ordine, scrivi:
SELECT clienti.nome, ordini.totaleFROM clientiINNER JOIN ordini ON clienti.id = ordini.cliente_id;Il risultato sarà:
| nome | totale |
|---|---|
| Luca | 49.90 |
| Marta | 18.50 |
Sara non appare perché non ha ordini collegati.
Cosa fa INNER JOIN
Sezione intitolata “Cosa fa INNER JOIN”INNER JOIN tiene solo le righe che trovano una corrispondenza in entrambe le tabelle.
Nel nostro esempio:
- Luca ha un ordine, quindi appare.
- Marta ha un ordine, quindi appare.
- Sara non ha ordini, quindi non appare.
Il risultato contiene solo i nomi presenti in entrambe le liste.
La parte più importante: ON
Sezione intitolata “La parte più importante: ON”Questa riga è il collegamento:
ON clienti.id = ordini.cliente_idSignifica:
“Abbina un cliente a un ordine quando l’id del cliente è uguale al
cliente_idsalvato nell’ordine.”
Se sbagli questa condizione, la join collega righe sbagliate. Per questo conviene leggerla sempre con calma.
Perché scriviamo clienti.nome
Sezione intitolata “Perché scriviamo clienti.nome”Quando usi più tabelle, possono esistere colonne con lo stesso nome.
Per esempio, sia clienti sia ordini hanno una colonna id. Scrivere clienti.id o ordini.id evita ambiguità.
Il nome della tabella chiarisce a quale id ti riferisci.
LEFT JOIN: tenere anche chi non ha corrispondenze
Sezione intitolata “LEFT JOIN: tenere anche chi non ha corrispondenze”A volte vuoi vedere tutti i clienti, anche quelli che non hanno ancora fatto ordini.
In quel caso usi LEFT JOIN:
SELECT clienti.nome, ordini.totaleFROM clientiLEFT JOIN ordini ON clienti.id = ordini.cliente_id;Il risultato diventa:
| nome | totale |
|---|---|
| Luca | 49.90 |
| Marta | 18.50 |
| Sara | NULL |
NULL significa che manca un valore. Qui vuol dire: “per Sara non esiste un ordine collegato”.
Quale join scegliere?
Sezione intitolata “Quale join scegliere?”All’inizio concentrati su queste due:
INNER JOINquando vuoi solo le righe che si abbinano.LEFT JOINquando vuoi tenere tutte le righe della tabella di sinistra.
Esistono anche RIGHT JOIN e FULL JOIN, ma puoi incontrarle più avanti. Nelle query quotidiane, INNER JOIN e LEFT JOIN coprono già tantissimi casi.
Riepilogo rapido
Sezione intitolata “Riepilogo rapido”- Una
JOINlegge insieme dati di tabelle diverse. INNER JOINmostra solo le corrispondenze.LEFT JOINtiene anche le righe senza corrispondenza a destra.ONspiega come collegare le tabelle.- Scrivere
tabella.colonnaevita confusione quando più tabelle hanno colonne simili.