Le join sono operazioni fondamentali nel linguaggio SQL che permettono di combinare i dati di due o più tabelle in base a criteri di corrispondenza tra le loro colonne. Il risultato sarà un unico set di righe con colonne estratte da entrambe le tabelle.
Sintassi
In generale, la sintassi per effettuare una JOIN in MySQL è la seguente:
SELECT colonna1, colonna2, ...
FROM tabella1
[INNER | LEFT | RIGHT] JOIN tabella2
ON condizione;
Dove:
colonna1, colonna2, ...
sono le colonne che si vogliono visualizzare nel risultato della querytabella1
etabella2
sono le tabelle da combinare. Si possono usare anche alias per semplificare la scrittura della query.condizione
è l’espressione che stabilisce il criterio di corrispondenza tra le colonne delle due tabelle. Supporta tutti gli operatori logici e di confronto (AND
,OR
,>=
, ecc).
Trattandosi di una SELECT, il dataset risultante può essere ulteriormente filtrato con l’uso di clausole WHERE, GROUP BY, HAVING, ecc…
Esistono diversi tipi di JOIN, che si differenziano in base alla modalità di gestione delle righe che non soddisfano i criteri. In quest’articolo vedremo le principali tipologie.
Un caso di studio
Per illustrare le principali tipologie di JOIN, consideriamo le seguenti due tabelle:
studenti
id | nome | cognome | classe |
---|---|---|---|
1 | Mario | Rossi | 3A |
2 | Anna | Bianchi | 3B |
3 | Luca | Verdi | 3C |
4 | Sara | Neri | 3A |
5 | Marco | Gialli | 3B |
voti
id_studente | materia | voto |
---|---|---|
1 | Matematica | 7 |
1 | Italiano | 8 |
2 | Matematica | 6 |
2 | Italiano | 9 |
3 | Matematica | 8 |
4 | Italiano | 7 |
5 | Matematica | 5 |
INNER JOIN
SELECT s.nome, s.cognome, v.voto
FROM studenti s
INNER JOIN voti v
ON s.id = v.id_studente
WHERE v.materia = 'Matematica';
Si noti l’utilizzo degli alias s e v.
Il risultato della query precedente sarà:
nome | cognome | voto |
---|---|---|
Mario | Rossi | 7 |
Anna | Bianchi | 6 |
Luca | Verdi | 8 |
Marco | Gialli | 5 |
La riga relativa a Sara Neri non compare perchè non ha una corrispondenza nella tabella voti per la clausola WHERE specificata.
Le INNER JOIN sono la tipologia più comune ed è possibile effettuarle anche omettendo la parola chiave INNER.
LEFT JOIN
Le LEFT JOIN permettono di restituire un dataset in cui sono presenti sia combinazioni di righe che hanno corrispondenze in entrambe le tabelle, sia righe della tabella a sinistra della JOIN che non hanno corrispondenze in quella di destra. Queste ultime vengono riempite con valori null all’occorrenza.
Supponiamo, per esempio, di voler ottenere nome, cognome e voto in italiano degli studenti. La query può utilizzare una LEFT JOIN ed essere simile alla seguente:
SELECT s.nome, s.cognome, v.voto
FROM studenti s
LEFT JOIN voti v
ON s.id = v.id_studente
AND v.materia = 'Italiano';
che risulterà nel seguente dataset:
nome | cognome | voto |
---|---|---|
Mario | Rossi | 8 |
Anna | Bianchi | 9 |
Luca | Verdi | NULL |
Sara | Neri | 7 |
Marco | Gialli | NULL |
Si può notare che tutti gli studenti sono presenti, ma le righe relative a Luca Verdi e Marco Gialli hanno valore null nella colonna voto. Questo accade perchè gli studenti in questione non hanno voti in italiano.
RIGHT JOIN
Le RIGHT JOIN permettono di restituire un dataset in cui sono presenti sia combinazioni di righe che hanno corrispondenze in entrambe le tabelle, sia righe della tabella a destra della JOIN che non hanno corrispondenze in quella di sinistra. Queste ultime vengono riempite con valori null all’occorrenza.
Supponiamo, per esempio, di voler ottenere nome, cognome e voto in italiano degli studenti, come nell’esempio precedente. Possiamo utilizzare una RIGHT JOIN invertendo i ruoli delle tabelle studente e voti, come segue:
SELECT s.nome, s.cognome, v.voto
FROM voti v
RIGHT JOIN studenti s
ON s.id = v.id_studente
AND v.materia = 'Italiano';
che avrà gli stessi risultati della LEFT JOIN vista in precedenza.
Conclusione
In questo articolo abbiamo visto cos’è una JOIN in MySQL. Abbiamo definito le principali tipologie e illustrato il loro utilizzo mediante un esempio semplificato. Spero che quest’articolo vi sia stato utile e che vi abbia chiarito come utilizzare le JOIN nei vostri progetti.