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

7 esempi di JOIN SQL con spiegazioni dettagliate

Avete bisogno di unire diverse tabelle per ottenere il set di risultati necessario? L'SQL JOIN è uno strumento di base ma importante utilizzato dagli analisti di dati che lavorano con i database relazionali. Capisco che possa essere difficile scegliere tra le milioni di guide introduttive alle unioni. In questo articolo mi concentrerò su esempi reali con spiegazioni dettagliate.

Introduzione alle JOIN

Nei database relazionali, le informazioni desiderate sono spesso memorizzate in diverse tabelle. In questi scenari, è necessario unire queste tabelle. È qui che entra in gioco il JOIN SQL.

La clausola JOIN in SQL viene utilizzata per combinare le righe di diverse tabelle in base a una colonna correlata tra queste tabelle. Una panoramica dello strumento SQL JOIN è disponibile in questo articolo introduttivo.

In questa guida, intendo trattare i tipi di base di SQL JOINs attraverso diversi esempi. Discuterò in dettaglio la sintassi di ciascuna query, il suo funzionamento, la costruzione di una condizione e l'interpretazione dei risultati.

Per gli esempi, utilizzeremo le informazioni relative a una casa editrice che pubblica libri originali e tradotti. Il nostro database contiene quattro tabelle: books, authors, editors, e translators.

books
idtitletypeauthor_ideditor_idtranslator_id
1Time to Grow Up!original1121
2Your Triptranslated152232
3Lovely Loveoriginal1424
4Dream Your Lifeoriginal1124
5Orangestranslated122531
6Your Happy Lifetranslated152233
7Applied AItranslated132334
8My Last Bookoriginal1128

authors
idfirst_namelast_name
11EllenWriter
12OlgaSavelieva
13JackSmart
14DonaldBrain
15YaoDou

editors
idfirst_namelast_name
21DanielBrown
22MarkJohnson
23MariaEvans
24CathrineRoberts
25SebastianWright
26BarbaraJones
27MatthewSmith

translators
idfirst_namelast_name
31IraDavies
32LingWeng
33KristianGreen
34RomanEdwards

Se volete esercitarvi a unire le tabelle in SQL con molti esempi, vi consiglio di seguire il corso SQL JOINs corso. Include 93 sfide di codifica!

GIUNTA INTERNA

Inizieremo con una query di base INNER JOIN, o semplicemente JOIN. Questo tipo di join viene utilizzato quando si vogliono visualizzare i record corrispondenti di due tabelle.

Esempio 1

Supponiamo di voler mostrare i titoli dei libri insieme ai loro autori (cioè il nome e il cognome dell'autore). I titoli dei libri sono memorizzati nella tabella books e i nomi degli autori sono memorizzati nella tabella authors tabella.

Nella nostra query SQL, uniremo queste due tabelle facendo corrispondere la colonna author_id della tabella books e la colonna id della tabella authors:

SELECT b.id, b.title, a.first_name, a.last_name
FROM books b
INNER JOIN authors a
ON b.author_id = a.id
ORDER BY b.id;

Nell'istruzione SELECT, elenchiamo le colonne da visualizzare: id del libro, titolo del libro, nome e cognome dell'autore. Nella clausola FROM si specifica la prima tabella da unire (detta anche tabella di sinistra). Nella clausola INNER JOIN si specifica la seconda tabella da unire (detta anche tabella di destra).

Quindi, si utilizza la parola chiave ON per indicare al database quali colonne devono essere utilizzate per la corrispondenza dei record (cioè, la colonna author_id della tabella books e la colonna id della tabella authors tabella).

Si noti anche che stiamo usando degli alias per i nomi delle tabelle (es, b per books e a per authors). Gli alias vengono assegnati nelle clausole FROM e INNER JOIN e utilizzati in tutta la query. Gli alias delle tabelle riducono la digitazione e rendono la query più leggibile.

Ecco l'insieme risultante:

idtitlefirst_namelast_name
1Time to Grow Up!EllenWriter
2Your TripYaoDou
3Lovely LoveDonaldBrain
4Dream Your LifeEllenWriter
5OrangesOlgaSavelieva
6Your Happy LifeYaoDou
7Applied AIJackSmart
8My Last BookEllenWriter

Per ogni record della tabella di sinistra (ad esempio, books), la query controlla author_id, quindi cerca lo stesso id nella prima colonna della tabella. authors tabella. Quindi estrae il nome e il cognome corrispondenti.

Si noti che l'ordine delle tabelle non ha importanza con un INNER JOIN o un semplice JOIN. L'insieme dei risultati sarebbe esattamente lo stesso se si inserisse la tabella authors nella clausola FROM e la tabella books nella clausola INNER JOIN.

INNER JOIN visualizza solo i record disponibili in entrambe le tabelle. Nel nostro esempio, tutti i libri hanno un autore corrispondente e tutti gli autori hanno almeno un libro corrispondente. Vediamo quindi cosa succede se alcuni record non vengono abbinati.

Esempio n. 2

Nel nostro secondo esempio, visualizzeremo i libri insieme ai loro traduttori (cioè, il cognome del traduttore). Solo la metà dei libri è stata tradotta e quindi ha un traduttore corrispondente. Quindi, quale sarebbe il risultato dell'unione degli elementi books e translators utilizzando INNER JOIN?

SELECT b.id, b.title, b.type, t.last_name AS translator
FROM books b
JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitletypetranslator
2Your TriptranslatedWeng
5OrangestranslatedDavies
6Your Happy LifetranslatedGreen
7Applied AItranslatedEdwards

La query produce solo i libri che sono stati tradotti. Ho aggiunto la colonna del tipo per renderla più chiara. Il resto dei libri non ha potuto essere abbinato alla tabella translators e quindi non vengono visualizzati. Ecco come funziona INNER JOIN.

Si noti inoltre che nel secondo esempio è stata utilizzata la parola chiave JOIN invece di INNER JOIN. Non ha alcun impatto sul risultato perché INNER JOIN è il tipo di join predefinito in SQL. Per conoscere gli altri tipi di join in SQL, consultare questa guida dettagliata.

Ok. Ora sappiamo come unire le tabelle quando è necessario visualizzare solo i record corrispondenti. Ma se volessimo mantenere tutti i libri nell'insieme risultante senza ridurre la tabella ai soli libri tradotti? È il momento di imparare le join esterne!

GIUNZIONE SINISTRA

Inizieremo la nostra panoramica sulle JOIN ESTERNE con LEFT JOIN. Questo tipo di JOIN SQL va applicato quando si desidera mantenere tutti i record della tabella di sinistra e solo i record corrispondenti della tabella di destra.

Esempio #3

Per esempio, supponiamo di voler visualizzare le informazioni sull'autore e sul traduttore di ogni libro (cioè i loro cognomi). Vogliamo anche mantenere le informazioni di base su ogni libro (ad esempio, id, title e type).

Per ottenere tutti questi dati, dobbiamo unire tre tabelle: books per le informazioni di base sui libri, authors per i cognomi degli autori e translators per i cognomi dei traduttori.

Come abbiamo visto nell'esempio precedente, utilizzando INNER JOIN (o il semplice JOIN) per unire la tabella translators si perdono tutti i record dei libri originali (non tradotti). Questo non è ciò che vogliamo ora. Quindi, per mantenere tutti i libri nell'insieme dei risultati, uniremo le tabelle books, authors, e translators utilizzando il comando LEFT JOIN.

SELECT b.id, b.title, b.type, a.last_name AS author, 
 t.last_name AS translator
FROM books b
LEFT JOIN authors a
ON b.author_id = a.id
LEFT JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;

Si noti che iniziamo con la tabella books nella clausola FROM, rendendola la tabella di sinistra. Questo perché vogliamo conservare tutti i record di questa tabella. L'ordine delle altre tabelle non ha importanza.

Nella nostra query, per prima cosa LEFT JOIN la tabella authors in base alla colonna author_id della tabella books e la colonna id della tabella authors tabella. Quindi, uniamo la tabella translators tabella in base alla colonna translator_id della tabella books e la colonna id della tabella translators tabella.

Ecco la tabella risultante:

idtitletypeauthortranslator
1Time to Grow Up!originalWriterNULL
2Your TriptranslatedDouWeng
3Lovely LoveoriginalBrainNULL
4Dream Your LifeoriginalWriterNULL
5OrangestranslatedSavelievaDavies
6Your Happy LifetranslatedDouGreen
7Applied AItranslatedSmartEdwards
8My Last BookoriginalWriterNULL

Fantastico! Abbiamo conservato tutti i libri!

Si notino i valori NULL nella colonna translator. Questi valori NULL corrispondono ai record che non hanno trovato corrispondenza nella tabella. translators tabella. Questi record sono relativi a libri originali senza traduttori.

Si spera di aver compreso l'intuizione delle JOIN SINISTRE. Per saperne di più su questo tipo di JOIN SQL, consultate questa guida introduttiva.

Bene, vediamo un altro esempio di LEFT JOIN per consolidare le conoscenze sull'argomento.

Esempio n. 4

Questa volta vogliamo mostrare le informazioni di base del libro (cioè ID e titolo) insieme ai cognomi degli editori corrispondenti. Anche in questo caso, vogliamo mantenere tutti i libri nell'insieme dei risultati. Quindi, quale sarebbe la query?

SELECT b.id, b.title, e.last_name AS editor
FROM books b
LEFT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL

Piuttosto semplice, no? Anche in questo caso abbiamo mantenuto tutti i libri nel set di risultati, compreso l'ultimo, che non ha un editore corrispondente nel nostro database (notare il valore NULL nell'ultima riga).

Possiamo immaginare che l'editore non sia presente nella tabella degli editori attuali semplicemente perché ha lasciato la casa editrice dopo aver curato il libro.

E se nel team ci fossero dei redattori che non hanno ancora pubblicato alcun libro? Verifichiamo con il tipo di join esterno successivo.

GIUNTA GIUSTA

RIGHT JOIN è molto simile a LEFT JOIN. Scommetto che avete indovinato che l'unica differenza è che RIGHT JOIN conserva tutti i record della tabella di destra, anche se non possono essere abbinati alla tabella di sinistra. Se lo avete fatto, avete ragione!

Esempio #5

Ripetiamo l'esempio precedente, ma questa volta il nostro compito sarà quello di conservare tutti i record della tabella. editors tabella. Avremo quindi la stessa query dell'esempio #4, ma sostituiremo LEFT JOIN con RIGHT JOIN:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
RIGHT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
NULLNULLJones
NULLNULLSmith

Con la modifica di una sola parola nella query, il risultato è molto diverso. Possiamo vedere che abbiamo due editori(Jones e Smith) che non hanno libri corrispondenti nel nostro database. Sembrano nuove assunzioni!

E questo non è l'unico cambiamento. Non c'è nemmeno Il mio ultimo libro nell'insieme dei risultati. Questo record della tabella di sinistra (ad es, books) non ha trovato riscontro nella tabella di destra (cioè, ), editors) e non è stato inserito nel risultato finale.

Le RIGHT JOIN sono raramente utilizzate nella pratica, perché di solito possono essere sostituite da LEFT JOIN, molto più comuni.

Per esempio, nel nostro caso, potremmo prendere la nostra query dall'esempio #4 e scambiare semplicemente books e editors inserendo editors nella clausola FROM, rendendola la tabella di sinistra, e mettendo books nella clausola LEFT JOIN, rendendola la tabella di destra. Il risultato sarebbe stato lo stesso della tabella precedente.

JOIN COMPLETO

Siamo arrivati all'ultimo tipo di join esterno, che è FULL JOIN. Si usa FULL JOIN quando si vogliono conservare tutti i record di tutte le tabelle, anche quelli non corrispondenti. Quindi, è come la combinazione di LEFT JOIN e RIGHT JOIN. Passiamo subito agli esempi per vedere come funziona in pratica.

Esempio #6

Per cominciare, uniamo di nuovo le tabelle books e editors ma questa volta terremo tutti i record di entrambe le tabelle. Utilizziamo semplicemente FULL JOIN come parola chiave di join, lasciando il resto della query senza alcuna modifica:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
FULL JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL
NULLNULLJones
NULLNULLSmith

Sembra fantastico! Come previsto, abbiamo mantenuto tutti i libri, anche quelli che non hanno un editore corrispondente. Inoltre, abbiamo mantenuto tutti gli editori, anche quelli che non hanno ancora un libro corrispondente.

Si noti che l'ordine delle tabelle non è importante con FULL JOIN. Il risultato sarebbe lo stesso se si scambiassero le tabelle mettendo la tabella editors nella clausola FROM e la tabella books nella clausola FULL JOIN.

Esempio #7

Nel nostro ultimo esempio, vogliamo unire tutte e quattro le tabelle per ottenere informazioni su tutti i libri, gli autori, gli editori e i traduttori in un'unica tabella. Pertanto, utilizzeremo FULL JOIN in tutta la nostra query SQL:

SELECT b.id, b.title, a.last_name AS author, e.last_name AS editor,
    t.last_name AS translator
FROM books b
FULL JOIN authors a
ON b.author_id = a.id
FULL JOIN editors e
ON b.editor_id = e.id
FULL JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitleauthoreditortranslator
1Time to Grow Up!WriterBrownNULL
2Your TripDouJohnsonWeng
3Lovely LoveBrainRobertsNULL
4Dream Your LifeWriterRobertsNULL
5OrangesSavelievaWrightDavies
6Your Happy LifeDouJohnsonGreen
7Applied AISmartEvansEdwards
8My Last BookWriterNULLNULL
NULLNULLNULLJonesNULL
NULLNULLNULLSmithNULL

Come richiesto, la tabella mostra tutti i libri, gli autori, gli editori e i traduttori. I record che non hanno trovato corrispondenza hanno i valori NULL. Questa è un'ottima panoramica dei dati memorizzati nel nostro database.

È ora di fare pratica con SQL JOINs!

La conoscenza di SQL JOINs è uno dei requisiti fondamentali per chiunque lavori con i database relazionali. Per aiutarvi a orientarvi tra i diversi tipi di JOIN SQL, LearnSQL.com ha sviluppato una scheda informativa sulle JOIN SQL di due pagine. Il documento fornisce la sintassi delle diverse JOIN e alcuni esempi.

Tuttavia, per padroneggiare le JOIN è necessario fare molta pratica. Vi consiglio di iniziare con il corso interattivo SQL JOINs che copre i principali tipi di JOIN attraverso decine di esempi ed esercizi. Per saperne di più su questo corso, consultate questo articolo riassuntivo.

BONUS: Ecco le 10 principali domande di colloquio su SQL JOIN e come rispondere.

Buon apprendimento!