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

SQL INNER JOIN spiegato in parole semplici

In questo articolo tratterò l'elemento forse più importante del linguaggio SQL. Proprio così! Sto parlando della clausola SQL INNER JOIN.

Come sapete, in un database i dati sono memorizzati in diverse tabelle. Nel mio ultimo articolo ho spiegato come creare query SQL quando i dati necessari si trovano in una sola tabella. Ma cosa succede se i dati necessari si trovano in due tabelle? In questo caso, è necessario utilizzare una clausola JOIN per combinare le due tabelle, che è qualcosa di simile al collegamento di entrambe le tabelle. In questo articolo spiegherò la clausola SQL INNER JOIN con parole semplici e con alcuni esempi di facile comprensione.

Un database di un'agenzia di viaggi

Forse sapete già che in un database i dati sono memorizzati in tabelle. Supponiamo di lavorare per un'agenzia di viaggi e che il database dell'agenzia abbia due tabelle: TRAVEL_PACK e CITIES. Nell'immagine seguente potete vedere il database, naturalmente non tutti i dati sono mostrati.

Esempio di TRAVEL_PACK Tabella

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500.0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

Esempio di CITIES Tabella

NAMETYPE_OF_CITYPACK_NAMEDAYS_STAYING
San FranciscohistoricalUnited States: West Coast5
WashingtonhistoricalUnited States: Big Cities3
New YorkbusinessUnited States: Big Cities7
Rio de JaneirobeachBeaches of Brazil4
UshuaiamountainSouth American Tour3
Salvador de BahiabeachBeaches of Brazil3
Los AngelesbeachUnited States: West Coast7

Nota bene: per utilizzare una clausola JOIN per combinare due tabelle, è necessario che vi sia un campo o una colonna presente in entrambe le tabelle.

Nel database di esempio questo campo è il nome del pacchetto di viaggio. Come si può vedere nella tabella TRAVEL_PACK il nome del pacchetto si trova sotto la colonna PACK_NAMEe nella tabella CITIES tabella il nome del pacchetto è nella colonna PACK_NAME e anche nella tabella il nome del pacchetto è nella colonna È facile notare che entrambe le colonne hanno lo stesso nome, ma in altri database può essere diverso. In altre parole, quando si utilizza una clausola INNER JOIN, il nome della colonna comune può essere diverso in entrambe le tabelle oppure no. In ogni caso, ricordate il nome della colonna PACK_NAMEperché vi servirà in seguito per scrivere la clausola JOIN.

La prima JOIN SQL: ottenere i pacchetti di viaggio che includono le città di mare

Di solito consiglio di iniziare pensando a dove si trovano i dati di cui si ha bisogno per la query. In questo caso è chiaro che si avrà bisogno della tabella TRAVEL_PACK per ottenere i nomi dei pacchetti, ma allo stesso tempo sarà necessaria anche la tabella CITIES perché si deve verificare se la città è una città balneare o meno. Quindi, i dati necessari per questa query si trovano in due tabelle, motivo per cui è necessario utilizzare una JOIN SQL.

Quando si devono ottenere dati da due (o più) tabelle, è necessario utilizzare un SQL JOIN. L'SQL JOIN agisce come un connettore tra due tabelle, creando coppie di record. In pratica, prende due record (uno da ciascuna tabella) e li unisce in una coppia di record. Questo tipo di unione si chiama INNER JOIN e in SQL i termini JOIN e INNER JOIN sono esattamente la stessa cosa. Per i lettori che vogliono approfondire, esistono altri tipi di join SQL, ad esempio l'opposto del join INNER è un altro tipo di join chiamato LEFT join o OUTER LEFT join, e si possono trovare anche altri tipi di join come RIGHT join, NATURAL join e LATERAL join tra gli altri. Potete imparare molti di questi tipi di join SQL nel corso online SQL JOINs . Tuttavia, in questo articolo mi concentrerò sulla INNER JOIN, che è davvero potente!

La prossima immagine mostra come la clausola JOIN crea una coppia di record:

Una GIF che rappresenta il funzionamento delle unioni interne di tabelle

(fare clic per ingrandire)

Ora mostrerò la sintassi per implementare una INNER JOIN, utilizzando il seguente schema

FROM table1 
INNER JOIN table2 ON common column in table1 = common column in table2

Se riempite il modello con le vostre tabelle di esempio e i nomi delle colonne, otterrete la prossima clausola INNER JOIN:

FROM CITIES 
INNER JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME

DA CITTÀ Una volta completata la clausola FROM con l'INNER JOIN, si può continuare a lavorare sulle clausole SELECT e WHERE della query. La clausola SELECT è facile perché è sufficiente restituire la colonna NAME, quindi la clausola sarà:

SELECT TRAVEL_PACK.PACK_NAME

Si noti che il riferimento alla colonna PACK_NAME viene fatto aggiungendo un prefisso al nome della tabella (TRAVEL_PACK in questo caso). Questa è una buona pratica da applicare quando la query coinvolge più di una tabella.

Nella clausola WHERE è necessario filtrare i risultati per includere solo le città balneari. La clausola sarà quindi::

WHERE CITIES.TYPE_OF_CITY = 'beach'

Infine, se si mettono insieme tutte le clausole, la query sarà:

SELECT TRAVEL_PACK.PACK_NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE CITIES.TYPE_OF_CITY = 'beach'

Di seguito è riportato il risultato della query precedente:

NAME
Los Angeles
Salvador de Bahia
Rio de Janeiro

La prossima join: le città incluse nei pacchetti di viaggio che costano meno di 2500 dollari

Anche in questo caso, come per la query precedente, è necessario accedere a due tabelle, utilizzando un JOIN per le colonne CITIES e TRAVEL_PACK per le tabelle. Si noti che uso il termine JOIN invece di INNER JOIN perché entrambi sono esattamente la stessa cosa in SQL.

Dalla query precedente si sa già come creare la clausola JOIN. Le modifiche riguardano le clausole SELECT e WHERE, come si vedrà nei paragrafi seguenti.

La clausola select è semplice, perché serve solo il nome della città:

SELECT CITY.NAME

Nella clausola where è necessario filtrare in base al prezzo del pacchetto di viaggio, quindi la clausola WHERE sarà:

WHERE TRAVEL_PACK.PRICE <= 2500

La query completa sarà quindi la seguente:

SELECT CITY.NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE TRAVEL_PACK.PRICE <= 2500

Il risultato della query precedente sarà:

NAME
Rio de Janeiro
Ushuaia
Salvador de Bahia

Immersione profonda: INNER JOIN per tre tabelle

È possibile utilizzare una INNER JOIN con più di due tabelle? Certo che sì. Inoltre, è possibile utilizzare una clausola JOIN con tutte le tabelle che si desidera.

Tuttavia, è necessario ricordare che ogni clausola di JOIN SQL è valida solo per una singola coppia di tabelle. Quindi, se avete tre tabelle da unire, come T1, T2 e T3, avrete bisogno di due clausole SQL JOIN, come si può vedere nell'esempio seguente:

FROM T1 JOIN T2 ON ...... 
				JOIN T3 ON .......

Ho lasciato la clausola ON vuota perché spiegherò questa parte con l'esempio seguente. Si supponga di estendere il database dell'agenzia aggiungendo una nuova tabella chiamata STATI, in cui si intende memorizzare gli stati, le regioni o le province di ciascun Paese. Il database con tre tabelle sarà come nella figura seguente:

TRAVEL_PACK Tabella

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500.0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

STATES Tabella

NAMECOUNTRYPOPULATIONLANGUAGE
New YorkUnited States17000000english
Tierra del FuegoArgentina190000spanish
CaliforniaUnited States13400000english
Rio de JaneiroBrasil15000000portuguese
BahiaBrasil8000000portuguese

CITIES Tabella

NAMETYPE_OF CITYPACK_NAMEDAYS_STAYSTATE
San FranciscohistoricalUnited States: West Coast5California
WashingtonhistoricalUnited States: Big Cities3Washington
New YorkbusinessUnited States: Big Cities7New York
Rio de JaneirobeachBeaches of Brazil4Rio de Janeiro
UshuaiamountainSouth American Tour3Tierra del Fuego
Salvador de BahiabeachBeaches of Brazil3Bahia
Los AngelesbeachUnited States: West Coast7California

Supponiamo di dover ottenere un report con un elenco di tutte le città con lo stato, il nome del pacchetto e la lingua utilizzata nella città negli stati in cui la lingua è lo spagnolo o il portoghese. È chiaro che è necessario unire le tabelle CITIES e STATES e poi unire il risultato anche con la tabella TRAVEL_PACK tabella. Si può iniziare applicando quanto appreso negli esempi precedenti.

Innanzitutto, utilizzare una clausola JOIN per combinare la tabella CITIES con la tabella STATES. È chiaro che è necessario utilizzare le colonne CITIES.STATE e STATE.NAME nella clausola ON. La clausola from sarà quindi la seguente:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME 

Successivamente, è necessario aggiungere la terza tabella alla clausola JOIN, ovvero la tabella TRAVEL_PACK. Si è già appreso come unire questa tabella in un esempio precedente, quindi il JOIN completo sarà:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME

Aggiungendo le clausole SELECT e WHERE, la query completa sarà la seguente:

SELECT CITIES.NAME, STATES.NAME, TRAVEL_PACK.PACK_NAME, STATES.LANGUAGE
FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE STATES.LANGUAGE IN ('spanish','portuguese')

E il risultato sarà:

NAMENAMEPACK_NAMELANGUAGE
SalvadorBahiaBeaches of Brazilportuguese
Rio de JaneiroRio de JaneiroBeaches of Brazilportuguese
UshuaiaTierra del FuegoSouth American Tourspanish

Passi successivi per continuare a imparare

In questo articolo ho spiegato come unire le tabelle in SQL. Ho spiegato con degli esempi cos'è un INNER JOIN in SQL e come funziona la clausola JOIN. La clausola JOIN apre un mondo enorme di nuove possibilità in SQL. Pensate che qualsiasi persona non tecnica in grado di utilizzare la clausola JOIN nelle query SQL ha un valore aggiunto come dipendente, indipendentemente dall'area aziendale in cui lavora. Approfondite la conoscenza di SQL JOINs e diventate un solido collaboratore della vostra azienda!