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

Come scrivere join multipli in una query SQL

Vi siete mai chiesti come funzionano i join multipli? Volete sapere come unire più tabelle in una sola query? Leggete questo articolo per scoprirlo!

Se siete alle prime armi con l'SQL, potreste avere difficoltà a capire il concetto di JOINSQL, soprattutto se dovete unire più di due tabelle in una sola query. Non preoccupatevi! In questo articolo esploreremo il funzionamento di JOIN e risolveremo tutti i suoi misteri!

Il modo migliore per imparare l'SQL è la pratica. Se volete imparare a unire le tabelle in SQL, date un'occhiata al nostro corso interattivo. SQL JOINs interattivo. Offre oltre 90 esercizi pratici che vi permetteranno di scrivere diversi tipi di JOIN.

Cominciamo con un esempio

Immaginate di avere le seguenti tre tabelle: player, team, e coach.

Come scrivere più join in un'unica query SQL

Costruiamo una query che elenchi i nomi di tutti i giocatori, il nome della loro squadra e il nome del loro allenatore. È possibile ottenere tutte queste informazioni utilizzando la seguente query:

SELECT 
  player.name, 
  team.name, 
  coach.name
FROM player
JOIN team
ON player.team_id = team.id
JOIN coach
ON team.coach_id = coach.id;

Abbiamo due diverse operazioni di JOIN. Le tabelle player e team vengono unite per prime, quindi viene unita anche la tabella coach.

Per creare una condizione di join, è necessario che entrambe le tabelle unite abbiano una colonna che contenga le stesse informazioni. La colonna team_id della tabella player contiene il valore team_id; questo è lo stesso valore della colonna id della tabella. team della tabella. Pertanto, la prima condizione di unione è ON player.team_id = team.id

Allo stesso modo, la join tra la tabella team e la tabella coach è ON team.coach_id = coach.id.

Se avete difficoltà a ricordare l'esatta sintassi di SQL JOINs, assicuratevi di mettere tra i preferiti il nostro fantastico SQL JOIN Cheat Sheet!

Come funziona l'unione di più tabelle

Supponiamo di avere i seguenti dati nelle nostre tabelle:

coach
idname
1Mark Swanson
2Alice Wright
team
idnamecoach_id
1Ambitious Raptors2
2Fire Pandas1
3Steel Cats2
player
idnameteam_id
1John Rodger1
2Paul Smith1
3David McDonald2
4Sarah Grey3
5Sophie Brown3

Eseguiamo ora una query che elenca i nomi di tutti i giocatori, il nome della loro squadra e il nome del loro allenatore:

SELECT player.name, team.name, coach.name
FROM player
JOIN team
ON player.team_id = team.id
JOIN coach
ON team.coach_id = coach.id;

Otterremo come risultato la seguente tabella:

player.nameteam.namecoach.name
John RodgerAmbitious RaptorsAlice Wright
Paul SmithAmbitious RaptorsAlice Wright
David McDonaldFire PandasMark Swanson
Sarah GreySteel CatsAlice Wright
Sophie BrownSteel CatsAlice Wright

Ok, ma cosa succede davvero "sotto il cofano" quando due tabelle vengono unite? Diamo un'occhiata più da vicino al nostro esempio.

Innanzitutto, il sito JOIN delle tabelle player e team forma una "tabella virtuale". L'aspetto è simile a questo:

player.idplayer.nameplayer.team_idteam.idteam.nameteam.coach_id
1John Rodger11Ambitious Raptors2
2Paul Smith11Ambitious Raptors2
3David McDonald22Fire Pandas1
4Sarah Grey33Steel Cats2
5Sophie Brown33Steel Cats2

Come si può vedere, questa "tabella virtuale" contiene tutte le colonne di entrambe le tabelle player e team e delle tabelle.

Ehi, abbiamo unito 3 tabelle in questa query di esempio! Cosa è successo alla tabella coach ? È facile! Abbiamo già una "tabella virtuale" composta dalle tabelle player e team quindi sembra che ci troviamo di nuovo di fronte a un join di due tabelle, solo che questa volta uniremo la tabella coach alla "tabella virtuale". Quindi, la tabella unita finale avrà questo aspetto:

player.idplayer.nameplayer.team_idteam.idteam.nameteam.coach_idcoach.idcoach.name
1John Rodger11Ambitious Raptors22Alice Wright
2Paul Smith11Ambitious Raptors22Alice Wright
3David McDonald22Fire Pandas11Mark Swanson
4Sarah Grey33Steel Cats22Alice Wright
5Sophie Brown33Steel Cats22Alice Wright

Le colonne che appartengono alla "tabella virtuale" (l'unione delle tabelle player e team) sono indicate in arancione; le colonne della tabella coach sono mostrate in blu.

Importante: quando si unisce un'altra tabella, la condizione di unione deve includere una colonna che corrisponde a una colonna di una delle tabelle precedentemente unite. Nel nostro esempio, la tabella coach viene unita alla tabella virtuale utilizzando l'ID dell'allenatore, che è presente nella tabella e nella tabella virtuale. coach e nella tabella team tabella. Pertanto, era presente nella "tabella virtuale". Si può immaginare che le tabelle unite siano "collegate" tra loro con condizioni di unione:

Come scrivere più join in un'unica query SQL

Naturalmente, non è necessario visualizzare tutte le colonne della tabella unita. Nelle query JOIN, di solito si specificano le colonne che si desidera visualizzare. Si noti che nella query di esempio precedente è stato fatto così: sono stati mostrati solo il nome del giocatore, il nome della squadra e il nome dell'allenatore.

Tabelle di giunzione

Una tabella di giunzione è una tabella che collega due o più tabelle. Molti join di più tabelle prevedono l'uso di una tabella di giunzione. Sembra vago? Vediamola in azione.

Immaginiamo di avere le tabelle author e book. Un autore può aver scritto molti libri e un libro può avere molti autori. Per modellare una relazione di questo tipo (chiamata relazione molti-a-molti), abbiamo bisogno di una terza tabella: author_book. L'unico scopo di questa tabella è quello di collegare le relazioni author e book tra loro. La tabella author_book è un esempio di tabella di giunzione.

Come scrivere più join in un'unica query SQL

Supponiamo di avere i seguenti dati nelle nostre tabelle:

author
idname
1Sarah Green
2Martin Davis
3Steve Johnson
book
idname
1The Translucent Door
2Whisper of Dawn
3To Catch a Dream
author_book
author_idbook_id
11
21
12
32
23

Se si vuole unire le tabelle author e book è necessario utilizzare anche la tabella di giunzione author_book. Ad esempio, per elencare tutti gli autori e i loro libri, si può scrivere una query come questa:

SELECT 
  author.name, 
  book.name
FROM author
JOIN author_book
ON author.id = author_book.author_id
JOIN book
ON book.id = author_book.book_id
ORDER BY author.name;

Per prima cosa, la tabella author_book viene unita alla tabella author per formare una "tabella virtuale". Poi, la tabella book viene unita alla "tabella virtuale".

Quando si uniscono tabelle collegate da una tabella di giunzione, assicurarsi di unire le tabelle non collegate alla tabella di giunzione. Nel nostro esempio, author è unita a author_book. Quindi book viene anch'essa unita. Se nel database è presente una tabella di giunzione, le giunzioni che coinvolgono queste tabelle di solito coinvolgono tre o più tabelle.

Il risultato della query sarà simile a questo. Nel risultato non si vede nessuna colonna della tabella di giunzione, ma l'unione è essenziale per far funzionare correttamente la query:

author.namebook.name
Sarah GreenThe Translucent Door
Martin DavisThe Translucent Door
Sarah GreenWhisper of Dawn
Steve JohnsonWhisper of Dawn
Martin DavisTo Catch a Dream

Una tabella di giunzione con colonne aggiuntive

Nell'esempio precedente, le uniche colonne presenti nella tabella di giunzione erano quelle che facevano riferimento ad altre tabelle. Tuttavia, non è necessario che sia così! La tabella di giunzione può contenere anche altri campi. Questi campi memorizzano informazioni aggiuntive sulla relazione.

Vediamo un esempio. Questa volta abbiamo le seguenti 3 tabelle: doctor, patient e appointment. Riuscite a indovinare qual è la tabella di giunzione?

Come scrivere più join in un'unica query SQL

È vero! La tabella di giunzione è la appointment tabella. Collega i medici con i loro pazienti per creare appuntamenti. Tuttavia, la appointment tabella ha bisogno di colonne aggiuntive, come la data e l'ora dell'appuntamento.

Supponiamo di avere i seguenti dati nelle nostre tabelle:

doctor
idname
1Ann Johnson
2Marlene Smith
3John West
patient
idname
1Mary Brown
2Sally Rodgers
3Mark Jackson
appointment
iddoctor_idpatient_iddatetime
11116/04/20238:00
21316/04/20239:00
32217/04/20238:00
42117/04/20239:00
53317/04/202316:00

Ora, costruiamo una query che aiuti i medici a gestire i loro impegni: per ogni medico, vorremmo vedere tutte le date e gli orari dei suoi appuntamenti, oltre al nome del relativo paziente. È possibile ottenere tutte queste informazioni utilizzando la seguente query:

SELECT 
  doctor.name, 
  appointment.date, 
  appointment.time, 
  patient.name
FROM doctor
JOIN appointment
ON doctor.id = appointment.doctor_id
JOIN patient
ON appointment.patient_id = patient.id;

Per prima cosa, la tabella appointment viene unita alla tabella doctor per formare una "tabella virtuale". Poi, la tabella patient tabella viene unita alla "tabella virtuale" facendo riferimento alla tabella di giunzione appointment.

Il risultato della query è il seguente:

doctor.nameappointment.dateappointment.timepatient.name
Ann Johnson16/04/20238:00Mary Brown
Ann Johnson16/04/20239:00Mark Jackson
Marlene Smith17/04/20238:00Sally Rodgers
Marlene Smith17/04/20239:00Mary Brown
John West17/04/202316:00Mark Jackson

Una tabella di giunzione a 3 vie

Le tabelle di giunzione possono anche collegare tre o più tabelle. Ad esempio, immaginiamo che un medico lavori in diverse sedi di cliniche. Quando si fissa un appuntamento, viene assegnato un medico, ma bisogna anche scegliere la clinica in cui si svolgerà l'appuntamento. Quindi, la nostra appointment collega tre tabelle: doctor, patiente clinic.

In questo scenario, molte query richiederanno l'unione di tutte e quattro le tabelle. In alcune situazioni, le tabelle di giunzione possono collegare ancora più tabelle.

Uniamo alcune tabelle!

Ottimo lavoro! Avete appena imparato a utilizzare più JOIN in un'unica query SQL.

Riassumiamo quanto appena appreso:

  • Una JOIN a tre tabelle è una JOIN di due tabelle con un'altra join. La JOIN di due tabelle forma una "tabella virtuale" alla quale viene unita l'altra tabella.
  • La condizione di unione è solitamente un'uguaglianza tra alcune colonne di una tabella che condividono valori con colonne dell'altra tabella.
  • Quando si uniscono più di due tabelle, nella maggior parte dei casi è necessario assicurarsi che la condizione di unione si "colleghi" alle tabelle già unite.
  • Una tabella di giunzione è una tabella che collega due o più tabelle facendo riferimento agli ID delle tabelle interessate. Quando è coinvolta una tabella di giunzione, è probabile che si debba usare un join multitabella.

Se siete curiosi di saperne di più su SQL JOINs, date un'occhiata a questi articoli del nostro blog:

E per fare ancora un po' di pratica, ricordatevi di dare un'occhiata al nostro SQL JOINs corso interattivo!