Torna all'elenco degli articoli Articoli
Tempo di lettura: 10 minuti

Come unire 3 (o più) tabelle in SQL

L'uso di JOIN in SQL non significa che si possano unire solo due tabelle. È possibile unirne 3, 4 o anche di più! Le possibilità sono illimitate.

Il modo migliore per esercitarsi sulle SQL JOINs è il corso interattivo SQL JOINs di LearnSQL.it. Contiene oltre 90 esercizi pratici che vi permettono di rinfrescare le conoscenze delle SQL JOINs. Copre un'ampia gamma di argomenti, dalla semplice JOIN di 2 tabelle, all'unione di più tabelle e all'uso di OUTER JOIN, fino all'unione di una tabella con sé stessa.

Se avete appena imparato JOINs in SQL, potreste pensare che sia limitato a due tabelle. Non c'è da stupirsi: questo concetto può essere difficile da capire e l'idea che le JOIN possano diventare ancora più complicate può spaventare all'inizio. La verità è che si può facilmente estendere questa idea a tre o più tabelle. Guardate la query qui sotto:

SELECT
  studente.nome,
  studente.cognome,
  corso.nome
FROM studente
JOIN corso_per_studenti
  ON studente.id = corso_per_studenti.id_studente
JOIN corso
  ON corso.id = corso_per_studenti.id_del_corso;

Abbiamo semplicemente ripetuto la clausola JOIN e unito tre tabelle. Approfondiremo la query e le tabelle nella prossima sezione.

Conoscere i dati

Per prima cosa, introduciamo alcune tabelle. Ecco lo schema:

Nel diagramma entità-relazione (ERD) qui sopra, si possono vedere le tabelle, le loro colonne, i tipi di dati delle colonne e i riferimenti tra le tabelle. Ad esempio, c'è un riferimento tra le tabelle studente e corso_per_studenti; ogni studente può essere collegato a più righe della tabella corso_per_studenti. Per ulteriori informazioni sulla lettura di uno schema, leggete l'articolo Crow's Foot Notation sul blog di Vertabelo.

I dati del nostro esempio sono memorizzati in quattro tabelle. Per ora ci concentreremo sulle prime tre tabelle:

  • studente - Contiene informazioni sugli studenti:
    • id - L'ID dello studente.
    • nome - Il nome dello studente.
    • cognome - Il cognome dello studente.
  • corso_per_studenti - Contiene informazioni su quali studenti frequentano quali corsi:
    • id_studente - L'ID dello studente.
    • id_del_corso - L'ID del corso.
  • corso - Contiene informazioni sui corsi:
    • id - L'ID del corso.
    • nome - Il nome del corso.
    • id_insegnante - L'ID del docente del corso.

Utilizzeremo la tabella insegnante più avanti nel corso, in query più avanzate. La spiegherò allora. Nel frattempo, date un'occhiata ai dati dell'esempio di queste tre tabelle:

studente

idnomecognome
1ShreyaBain
2RiannaFoster
3YosefNaylor

corso_per_studenti

id_studenteid_del_corso
12
13
21
22
23
31

corso

idnomeid_insegnante
1Database design1
2English literature2
3Python programming1

Tabelle di giunzione

È importante notare che la tabella corso_per_studenti è una tabella di raccordo. L'unico scopo di questa tabella è quello di collegare le tabelle studente e corso tra loro.

Ad esempio, "Shreya Bain" (lo studente con id = 1) è collegata a "English literature" (il corso con id = 2) e "Python programming" (il corso con id = 3). Come lo sappiamo? Osservate le prime due righe della tabella corso_per_studenti. La prima riga dice che lo studente con ID pari a 1 (colonna id_studente) è collegato a un corso con ID pari a 2 (colonna id_del_corso). Dalla seconda riga, vediamo che lo studente con l'ID uguale a 1 è collegato al corso con l'ID uguale a 3. Quindi, osservando la tabella studente, si legge che Shreya Bain ha un ID pari a 1. Infine, guardando la tabella corso, si può leggere che English literature e Python programming hanno ID pari a 2 e 3, rispettivamente.

La relazione tra gli elementi studente e corso si chiama relazione molti-a-molti. Uno studente può frequentare molti corsi (perciò molte righe con lo stesso id_studente possono trovarsi nella tabella corso_per_studenti) così come un corso può essere frequentato da più studenti (perciò molte righe della tabella corso_per_studenti possono avere lo stesso id_del_corso).

Abbiamo già visto l'uso della tabella di giunzione. Guardare di nuovo il codice:

SELECT
  studente.nome,
  studente.cognome,
  corso.nome
FROM studente
JOIN corso_per_studenti
  ON studente.id = corso_per_studenti.id_studente
JOIN corso
  ON corso.id = corso_per_studenti.id_del_corso;

Come si può notare, si utilizza la tabella studente nella clausola FROM. Poi, la uniamo con la tabella corso_per_studenti e, infine, con la tabella corso. In questo modo, possiamo mostrare il nome e il cognome di ogni studente insieme ai corsi che sta frequentando. Il codice è ancora confuso? Non temete: lo spiegheremo a fondo nella prossima sezione.

Il risultato di questa query sarà simile a questo:

nomecognomenome
ShreyaBainEnglish literature
ShreyaBainPython programming
RiannaFosterDatabase design
RiannaFosterEnglish literature
RiannaFosterPython programming
YosefNaylorDatabase design

Se volete scrivere le vostre query che uniscono più tabelle, dovete capire bene cosa succede in questa query. Suddividiamo la query in passi.

Unire 3 tabelle utilizzando una tabella di giunzione

Passo 1

Il primo passo consiste nell'esaminare lo schema e selezionare le colonne che vogliamo mostrare. Poiché vogliamo mostrare gli studenti insieme ai loro corsi, avremo bisogno di tre colonne: studente.nome, studente.cognome, e corso.nome.

È importante usare i nomi delle tabelle quando si elencano le colonne. In questo modo, non ci si perderà nei diversi nomi delle colonne e si saprà immediatamente quale colonna appartiene a quale tabella.

A questo punto, la nostra query dovrebbe avere questo aspetto:

SELECT
  studente.nome,
  studente.cognome,
  corso.nome

Passo 2

Il passo successivo consiste nel determinare quali tabelle saranno necessarie per la query. Due di loro sono ovvie: studente e corso. Tuttavia, dovremo trovare un modo per unire queste tabelle. Osservando lo schema del database, vediamo che corso_per_studenti è una tabella di giunzione tra queste due. Quindi, avremo bisogno anche di questa tabella.

Passo 3

Nella parte finale, dovremo unire tutte le tabelle. Il primo compito è quello di scegliere la tabella che andrà nella clausola FROM. In teoria, può essere una qualsiasi delle tabelle che stiamo usando. Personalmente, mi piace iniziare con una tabella che non sia una tabella di giunzione. In questo caso, scegliamo la tabella studente.

SELECT
  studente.nome,
  studente.cognome,
  corso.nome
FROM studente

Ora, non possiamo unire la tabella corso. Non c'è una connessione diretta tra queste due tabelle. Per questo motivo, dovremo scegliere la tabella corso_per_studenti. Dobbiamo semplicemente collegare le due tabelle utilizzando l'istruzione JOIN … ON …. Il nostro codice avrà questa forma:

SELECT
  studente.nome,
  studente.cognome,
  corso.nome
FROM studente
JOIN corso_per_studenti
  ON studente.id = corso_per_studenti.id_studente

Prima di passare all'aggiunta dell'ultima tabella, dobbiamo pensare a ciò che abbiamo già ottenuto. Si noti che, scrivendo una clausola JOIN, non siamo limitati alle colonne della clausola SELECT: abbiamo accesso a tutte le colonne! Quindi, la nostra query si presenta in questo modo:

SELECT
  studente.nome,
  studente.cognome,
  studente.id,
  corso_per_studenti.id_studente,
  corso_per_studenti.id_del_corso
FROM studente
JOIN corso_per_studenti
  ON studente.id = corso_per_studenti.id_studente;

Questa query mostra quasi tutte le colonne che possiamo utilizzare durante la scrittura della prossima istruzione JOIN. (Ho rimosso la colonna corso_per_studenti.id, perché non ci servirà). Guardate i dati con cui stiamo lavorando:

nomecognomeidid_studenteid_del_corso
ShreyaBain112
ShreyaBain113
RiannaFoster221
RiannaFoster222
RiannaFoster223
YosefNaylor331

Ecco come appaiono i nostri dati a metà percorso. Spesso è bene riflettere sui dati a questo punto. Si può scrivere una query di questo tipo di tanto in tanto, solo per analizzare le righe e le colonne.

Il risultato qui sopra dovrebbe mostrare chiaramente cosa fare in seguito. Abbiamo gli studenti collegati con gli ID dei corsi che stanno frequentando. L'unica cosa che dobbiamo aggiungere sono le informazioni sul corso. Sappiamo che la colonna id_del_corso è presente nella tabella corso_per_studenti. Dobbiamo unirla alla colonna id della tabella corso. La query risultante ha questo aspetto:

SELECT
  studente.nome,
  studente.cognome,
  corso.nome
FROM studente
JOIN corso_per_studenti
  ON studente.id = corso_per_studenti.id_studente
JOIN corso
  ON corso.id = corso_per_studenti.id_del_corso;

Ecco fatto! Questa è la query che volevamo scrivere. Non dimenticate il punto e virgola alla fine del codice.

In questo esempio, abbiamo analizzato come scrivere una query con JOIN equi - stiamo usando l'uguaglianza nelle nostre condizioni di unione. Questo è il tipo più comune di JOIN. Tuttavia, è possibile utilizzare anche JOIN non equi. Se non conoscete questo termine, vi consiglio di consultare An Illustrated Guide to the SQL Non-Equi Join sul blog LearnSQL.it.

Unire tabelle SQL senza una tabella di giunzione

Quando si uniscono più di due tabelle, non sempre si dispone di una tabella di giunzione. Ma prima di analizzare una query d'esempio per questa tecnica, controlliamo l'ultima tabella del nostro schema.

  • insegnante - Contiene informazioni sui docenti:
    • id - L'ID dell'insegnante.
    • nome - Il nome dell'insegnante.
    • cognome - Il cognome dell'insegnante.

Ed ecco come appare la tabella insegnante:

idnomecognome
1TaylahBooker
2Sarah-LouiseBlake

Ora, in base ai dati, vorremmo mostrare ogni insegnante con i propri studenti. Ogni coppia docente-studente deve essere mostrata solo una volta (ad esempio, se un docente ha più di un corso con uno studente, il docente deve essere mostrato solo una volta con lo studente nel risultato).

Questa query è abbastanza simile alla precedente. Pertanto, seguiremo gli stessi passi di prima.

Passo 1

Per prima cosa, selezioniamo le colonne: insegnante.nome, insegnante.cognome, studente.nome, e studente.cognome. Poi scegliamo le tabelle necessarie. Questa volta saranno tutte le tabelle del nostro schema: studente, corso_per_studenti, corso e insegnante.

Passo 2

Ora dobbiamo unire tutte le tabelle. Come ho detto prima, possiamo iniziare da qualsiasi tabella, ma io preferisco iniziare da uno dei lati. L'ultima volta abbiamo inserito la tabella studente nella clausola FROM. Questa volta useremo la tabella insegnante. Prima di scrivere qualsiasi JOIN, la nostra query avrà l'aspetto seguente. (Si noti la parola chiave DISTINCT; poiché vogliamo mostrare coppie distinte di insegnanti-studenti, la parola chiave è estremamente importante).

SELECT DISTINCT
  insegnante.nome,
  insegnante.cognome.
  studente.nome,
  studente.cognome
FROM insegnante

Passo 3

Ora, unire le tabelle non è molto diverso dall'esempio precedente. Dobbiamo solo usare la clausola JOIN un'altra volta. Tuttavia, prima di farlo, diamo un'occhiata ai dati dopo l'unione delle tabelle insegnante e corso:

SELECT
  insegnante.nome,
  insegnante.cognome,
  insegnante.id,
  corso.id_insegnante,
  corso.nome,
  corso.id
FROM insegnante
JOIN corso
  ON insegnante.id = corso.id_insegnante;
nomecognomeidid_insegnantenomeid
TaylahBooker11Database design1
TaylahBooker11Python programming3
Sarah-LouiseBlake22English literature2

Si può pensare a questa come un'unica tabella. In effetti, si tratta di una versione un po' più estesa della tabella corso.

L'unione di due tabelle aggiuntive è quasi identica alla procedura utilizzata in precedenza. È sufficiente aggiungere gli stessi due JOIN come prima. Bisogna solo tenere presente che le JOIN devono essere scritte nell'ordine corretto. Durante l'unione, non si possono usare colonne di tabelle non ancora introdotte.

SELECT DISTINCT
  insegnante.nome,
  insegnante.cognome.
  studente.nome,
  studente.cognome
FROM insegnante
JOIN corso
  ON insegnante.id = corso.id_insegnante
JOIN corso_per_studenti
  ON studente.id = corso_per_studenti.id_studente
JOIN studente
  ON corso_per_studenti.id_del_corso = corso.id;
JOIN corso_per_studenti
  ON corso.id = corso_per_studenti.id_studente
JOIN studente
  ON corso_per_studenti.id_del_corso = studente.id;

Nella parte barrata, ho copiato del codice dalla prima query in cui abbiamo unito tre tabelle. In questo caso, il codice era sbagliato; anche se le condizioni erano corrette, stavamo usando tabelle non ancora introdotte. Per esempio, mentre univamo le tabelle corso_per_studenti abbiamo usato la tabella studente che è stata introdotta successivamente.

Sotto il codice cancellato, è possibile vedere l'ordine corretto di JOIN. Uniamo prima le tabelle corso_per_studenti e le tabelle dei corsi. Poi, utilizzando la tabella corso_per_studenti possiamo unire la tabella studente. In questo modo, introduciamo ogni tabella prima di utilizzarla in una condizione JOIN … ON. Ricordate sempre questa importante regola!

Il risultato della query di cui sopra avrà il seguente aspetto:

nomecognomenomecognome
TaylahBookerShreyaBain
TaylahBookerRiannaFoster
TaylahBookerYosefNaylor
Sarah-LouiseBlakeShreyaBain
Sarah-LouiseBlakeRiannaFoster

In questo caso, abbiamo utilizzato un INNER JOIN. Ciò significa che se l'insegnante non ha studenti, questi non appariranno nei risultati. Naturalmente, è possibile sostituire INNER JOIN con qualsiasi altro tipo di JOIN, ad esempio LEFT OUTER JOIN. Per saperne di più su LEFT JOIN, consultare Come effettuare una LEFT JOIN tra più tabelle in SQL su LearnSQL.it.

Le basi sono fondamentali per le JOIN a 3 vie

Come si può vedere, unire tre tabelle in SQL non è così difficile come sembra. In realtà, è possibile unire tutte le tabelle che si desidera: l'idea alla base è la stessa di unire solo due tabelle.

È molto utile dare un'occhiata ai dati a metà percorso e immaginare che le tabelle già unite siano un'unica tabella.

Per avere successo con le JOIN complesse, è importante comprendere a fondo le JOIN di base. Conoscerle bene vi permetterà di scrivere istruzioni JOIN estremamente complesse. E ricordate: la pratica porta alla perfezione. Se avete bisogno di ulteriori spiegazioni o esercizi su JOINs in SQL, date un'occhiata al corso SQL JOINs su LearnSQL.it.