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

Come unire due tabelle in base a più colonne in SQL

La funzione SQL JOIN è uno strumento importante per combinare informazioni provenienti da diverse tabelle. Nella maggior parte dei casi, le tabelle vengono unite in base a una chiave primaria di una tabella e a una chiave esterna di un'altra tabella. Tuttavia, spesso è necessario unire le tabelle in base a due o più colonne. In questo articolo, illustrerò i motivi per cui si desidera unire le tabelle in base a più colonne e come farlo in SQL.

L'unione di tabelle per una sola colonna non funziona in alcuni scenari. Ad esempio, si possono verificare casi in cui non esiste una colonna nella tabella che identifichi in modo univoco le righe. Oppure le tabelle che si desidera unire potrebbero non avere una sola colonna comune da utilizzare per l'unione. In situazioni come queste, potrebbe essere necessario utilizzare più colonne per unire le tabelle, ad esempio il nome e il cognome, oppure il numero d'ordine e l'anno se la numerazione degli ordini ricomincia ogni anno.

Vediamo alcuni esempi per capire come funziona in pratica.

Unire due tabelle su più colonne

Immaginiamo di gestire una rete di asili. Nel nostro database abbiamo le seguenti tabelle:

  • students, dove abbiamo informazioni su ogni studente, come il nome, la scuola materna frequentata, la classe, l'anno di laurea e l'insegnante.
  • teachers, dove abbiamo il nome e il livello di istruzione di ogni insegnante.
  • classes, dove sono presenti informazioni su ogni classe, come il nome dell'asilo, la classe, l'anno di laurea e il nome dell'aula.
students
idfirst_namelast_namekindergartengraduation_yearclassteacher_first_nameteacher_last_name
1MaryJonesSunshine2021AIsabellaLopez
2JohnSmithLove & Learn2020BMiaGonzalez
3MarkAndersonButterfly2020BSophiaStevenson
4StevenMooreButterfly2021CMariaStuart
5DianaMillerButterfly2021CMariaStuart
6AnnaDavisSunshine2021AEmmaGrey
7HellenBrownSunshine2020BOliviaTaylor
8GracyLeeLove & Learn2020ACharlotteJohnson
9SaraGarciaLove & Learn2021BJasmineHarris
10KateWilsonSunshine2019BOliviaTaylor
teachers
idfirst_namelast_nameeducation
101IsabellaLopezUndergraduate
102MariaStuartUndergraduate
103EmmaGreyGraduate
104OliviaTaylorGraduate
105CharlotteJohnsonGraduate
106MiaGonzalezUndergraduate
107SophiaStevensonUndergraduate
108JasmineHarrisUndergraduate
classes
idkindergartengraduation_yearclassclassroom
201Sunshine2019BIronman
202Butterfly2020BSun
203Love & Learn2020ALove
204Love & Learn2020BHappiness
205Sunshine2020AHulk
206Sunshine2020BSuperman
207Butterfly2021AGarden
208Butterfly2021BIsland
209Butterfly2021CSea
210Love & Learn2021ADream
211Love & Learn2021BLaugh
212Sunshine2021AIronman

Si può notare che il nostro database non è perfettamente organizzato. In genere, la tabella students include chiavi esterne come l'ID dell'insegnante e l'ID della classe, invece di informazioni dettagliate sugli insegnanti e sulle classi corrispondenti. Tuttavia, anche con i dati memorizzati in questo modo, è possibile unire le tabelle, purché ogni tabella abbia una serie di colonne che identificano in modo univoco ogni record.

È il momento di eseguire un paio di query SQL!

Esempio 1: SQL JOIN per due colonne

Nel nostro primo esempio, vogliamo conoscere il livello di istruzione dell'insegnante per ogni studente. Per questo, dobbiamo unire le informazioni delle tabelle students e teachers. Sfortunatamente, non abbiamo la colonna ID insegnante nella tabella students tabella. Tuttavia, abbiamo il nome e il cognome dell'insegnante in entrambe le tabelle. Se non abbiamo insegnanti con nomi e cognomi identici, possiamo tranquillamente unire le tabelle in base a queste due colonne. Ecco la query:

SELECT s.first_name, s.last_name, s.teacher_first_name, s.teacher_last_name, t.education AS teacher_education
FROM students s
JOIN teachers t
ON s.teacher_first_name = t.first_name AND s.teacher_last_name = t.last_name;

Se avete bisogno di un ripasso della sintassi di SQL JOIN, date un'occhiata a questo ottimo SQL JOIN Cheat Sheet.

Notate le due condizioni nella clausola ON, in quanto si richiede che (1) il nome della tabella insegnanti sia uguale al nome dell'insegnante nella tabella studenti e (2) che il cognome della tabella insegnanti sia uguale al cognome dell'insegnante nella tabella studenti. Come si vede, per specificare due condizioni, è sufficiente inserirle entrambe nella clausola ON, utilizzando la parola chiave AND tra le due.

Ecco il risultato:

first_namelast_nameteacher_first_nameteacher_last_nameteacher_education
MaryJonesIsabellaLopezUndergraduate
StevenMooreMariaStuartUndergraduate
DianaMillerMariaStuartUndergraduate
AnnaDavisEmmaGreyGraduate
HellenBrownOliviaTaylorGraduate
KateWilsonOliviaTaylorGraduate
JohnSmithMiaGonzalezUndergraduate
MarkAndersonSophiaStevensonUndergraduate
GracyLeeCharlotteJohnsonGraduate
SaraGarciaJasmineHarrisUndergraduate

Sembra buono! Ora vediamo il livello di istruzione dell'insegnante corrispondente per ogni studente.

Per fare più pratica con le unioni di tabelle in SQL, consultate questo corso interattivo. SQL JOINs corso interattivo.

Esempio 2: SQL JOIN per tre colonne

Nell'esempio precedente abbiamo visto come unire due tabelle in base a due condizioni. Se necessario, possiamo avere anche più condizioni. Vediamo come unire le tabelle in SQL con tre condizioni.

Ora vogliamo scoprire il nome dell'aula in cui ogni studente ha giocato e studiato. Le informazioni sull'aula sono disponibili nella tabella classes nella tabella

Non abbiamo l'ID della classe nella tabella. students tabella. Tuttavia, abbiamo tre colonne che, combinate, identificano in modo univoco una classe: scuola materna, graduation_year, class. Le stesse colonne sono presenti nella classes tabella. Pertanto, combineremo students e classes utilizzando tre colonne:

SELECT s.first_name, s.last_name, c.kindergarten, c.graduation_year, c.class, c.classroom
FROM students s
JOIN classes c
ON s.kindergarten = c.kindergarten AND s.graduation_year = c.graduation_year AND s.class = c.class;

Come si può vedere, uniamo le tabelle utilizzando le tre condizioni poste nella clausola ON con le parole chiave AND in mezzo. Ecco il risultato:

first_namelast_namekindergartengraduation_yearclassclassroom
MarkAndersonButterfly2020BSun
JohnSmithLove & Learn2020BHappiness
StevenMooreButterfly2021CSea
MaryJonesSunshine2021AIronman
GracyLeeLove & Learn2020ALove
HellenBrownSunshine2020BSuperman
DianaMillerButterfly2021CSea
AnnaDavisSunshine2021AIronman
SaraGarciaLove & Learn2021BIronman
KateWilsonSunshine2019BLaugh

JOIN ha funzionato come previsto! Ora abbiamo la classe corrispondente per ogni studente.

Se volete vedere altri esempi, date un'occhiata a questo ricettario sull'unione di tabelle per colonne multiple.

Esercitiamoci su SQL JOINs per colonne multiple!

SQL JOIN è uno degli strumenti fondamentali per gli analisti di dati che lavorano con SQL. I database relazionali sono costruiti in modo tale che i report analitici di solito richiedono la combinazione di informazioni provenienti da diverse tabelle. Si uniscono le tabelle, a volte per una sola colonna, altre volte per due o più colonne.

Come si è visto, unire tabelle per più colonne è abbastanza semplice in SQL. Tuttavia, se si vuole acquisire sicurezza nell'uso di SQL JOINs, fare pratica con set di dati reali è un fattore di successo fondamentale.

Vi consiglio di iniziare con questo corso interattivo di SQL JOINs che comprende 93 sfide di codifica. Copre i tipi più comuni di join come JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, e i self-join, oltre ai join non equi.

Per fare ancora più pratica con SQL JOINs e con altri strumenti SQL di base, si può prendere in considerazione l'opportunità di seguire la SQL from A to Z Il percorso. Include 7 corsi interattivi che coprono le funzioni SQL standard, i report SQL di base, le funzioni finestra, le espressioni di tabella comuni, le query ricorsive e molto altro ancora.

Grazie per aver letto e buon apprendimento!