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

Che cos'è un SQL INNER JOIN?

Come si combinano i dati di diverse tabelle in un'unica query? Una funzione SQL chiamata JOIN è l'operatore più comunemente utilizzato per creare query complesse. In questo articolo ne scopriremo le basi.

SQL ci permette di selezionare dati da più tabelle. In effetti, l'idea di utilizzare i database relazionali è quella di selezionare i dati da tabelle correlate. Per farlo, possiamo utilizzare l'operatore JOIN di SQL.

Esistono molti tipi di JOIN in SQL. In questo articolo ci concentreremo su INNER JOIN, che è il comando predefinito di JOIN (cioè quello che si ottiene se si usa la parola chiave JOIN da sola).

Quando serve il JOIN?

Perché è necessario unire i dati di diverse tabelle? La risposta è semplice: a volte una sola tabella non contiene tutti i dati necessari.

Immaginate che la tabella movie memorizza le informazioni nelle colonne id, title, production_year e director_id.

idtitleproduction_yeardirector_id
1Psycho19601
2Midnight in Paris20112
3Sweet and Lowdown19932
4Talk to her20023
5The skin I live here20113

Un'altra tabella, directorcontiene informazioni sui registi: le loro colonne id, name, e birth_year.

idnamebirth_year
1Alfred Hitchcock1899
2Woody Allen1935
3Pedro Almodóvar1949

Si noti che ogni film ha solo una colonna relativa al regista: director_id. Gli stessi valori del numero ID nella tabella director (nella colonna director_id ) e nella tabella movie (nella colonna id ).

Vogliamo visualizzare i dati di ogni film insieme ai dettagli del suo regista. Il risultato è una nuova tabella con i dati di due tabelle: movie e director. Le tabelle sono combinate (o unite) in base ai numeri identificativi dei registi. In altre parole, i film con uno specifico director_id sono combinati con le informazioni del regista con questo ID - ad esempio, il film Psycho con director_id=1 è abbinato al record in cui id=1 (Alfred Hitchcock) nella tabella director tabella. Osservate l'insieme dei risultati:

idtitleproduction_yeardirector_ididnamebirth_year
1Psycho196011Alfred Hitchcock1899
2Midnight in Paris201122Woody Allen1935
3Sweet and Lowdown199322Woody Allen1935
4Talk to her200233Pedro Almodóvar1949
5The skin I live here201133Pedro Almodóvar1949

Una versione illustrata di un esempio simile è presentata nell'articolo An Illustrated Guide to the SQL INNER JOIN.

Come usare le JOIN in una query SQL

Analizziamo ora la query appena utilizzata. Eccola di nuovo:

SELECT *  
FROM movie  
JOIN director  
ON movie.director_id=director.id;

JOIN è una forma più breve della clausola INNER JOIN; è possibile utilizzarle in modo intercambiabile.

Dopo aver SELECT le colonne, si inserisce la parola chiave FROM e il nome della prima tabella (in questo esempio, movie). Poi si inserisce JOIN (o INNER JOIN), seguito dal nome della seconda tabella (qui, director). Poi si inserisce la parola chiave ON e la condizione di join (cioè come abbinare i record di entrambe le tabelle). In questo caso, la condizione di join fa corrispondere i valori della colonna director_id della tabella movie con la colonna id della tabella director.

In questo modo, i record della tabella movie sono abbinati ai record corretti in director. Ora sappiamo che il film Sweet and Lowdown è stato diretto dal regista Woody Allen, nato nel 1935. Questo film ha director_id=2; c'è un valore corrispondente alla colonna corrispondente (id) nella tabella director.

L'animazione sottostante mostra come funziona l'operatore JOIN e quali record vengono restituiti:

JOIN

L'operatore JOIN funziona logicamente in due fasi. Il primo passo restituisce un prodotto cartesiano, cioè ogni riga della prima tabella viene combinata con ogni riga della seconda tabella. Nel passaggio successivo, vengono restituite solo le coppie di record che soddisfano la condizione della clausola ON - in questo esempio, solo le righe in cui director_id in movie è uguale a id in director.

Si noti che i valori utilizzati nella condizione di join non devono essere necessariamente numeri. È possibile utilizzare anche valori di testo e altre condizioni più complesse. Per ulteriori informazioni, consultare l'articolo SQL INNER JOIN spiegato in parole semplici.

Cosa succede se i record non corrispondono?

Cosa succede se ci sono record nella prima tabella che non possono essere abbinati a record nella seconda tabella o viceversa? Come funziona INNER JOIN in questo caso? Vediamo un esempio. Ecco di nuovo la tabella movie di nuovo la tabella:

idtitleproduction_yeardirector_id
1Psycho19601
2Midnight in Paris20112
3Sweet and Lowdown19932
4Talk to her20023
5The skin I live in20113
6The new house2020NULL

Ed ecco director:

idnamebirth_year
1Alfred Hitchcock1899
2Woody Allen1935
3Pedro Almodóvar1949
4Martin Scorsese1942

Ecco la stessa query:

SELECT title, production_year, director_id,
       id, name, birth_year   
FROM movie  
JOIN director  
ON movie.director_id=director.id;

La tabella dei risultati contiene solo i record che sono una coppia corrispondente:

idtitleproduction_yeardirector_ididnamebirth_year
1Psycho196011Alfred Hitchcock1899
2Midnight in Paris201122Woody Allen1935
3Sweet and Lowdown199322Woody Allen1935
4Talk to her200233Pedro Almodóvar1949
5The skin I live in201133Pedro Almodóvar1949

Se si osserva la tabella moviela colonna director_id è NULL per il film La casa nuova. E nella tabella directoril regista Martin Scorsese (id=4) non è collegato a nessuna riga della tabella. movie. Pertanto, queste righe non vengono visualizzate nel set di risultati.

La regola di INNER JOIN (JOIN) è che vengono restituite solo le righe con corrispondenza in entrambe le tabelle. Negli altri tipi di operatori JOIN il comportamento è diverso. Approfondite questo argomento leggendo l'articolo SQL JOIN Types Explained.

Filtrare i record nel set di risultati

È anche possibile filtrare i record restituiti da JOIN. Ad esempio, si possono elencare solo i film e i loro registi il cui regista è nato dopo il 1940. Ecco la query:

SELECT title, production_year, director_id,
       id, name, birth_year   
FROM movie  
JOIN director  
ON movie.director_id=director.id
WHERE director.birth_year>1940;

Il risultato viene restituito:

idtitleproduction_yeardirector_ididnamebirth_year
4Talk to her200233Pedro Almodóvar1949
5The skin I live in201133Pedro Almodóvar1949

Ancora una volta, abbiamo righe della tabella movie combinate con righe della tabella director. Inizialmente, la condizione di join è la stessa (ON director.id=movie.director_id).

Tuttavia, nel passaggio successivo, i record con un valore inferiore o uguale a 1940 nella colonna anno_nascita vengono rimossi. Pertanto, non si trova Woody Allen nel set di risultati perché è nato nel 1935 (prima/meno del 1940). Non c'è nemmeno Alfred Hitchcock, nato nel 1899. Questo è stato possibile grazie a WHERE director.birth_year>1940.

Volete saperne di più su SQL JOINs?

Se si desidera ampliare le proprie competenze, provare il nostro corso SQL Basics che contiene ulteriori informazioni sull'unione di tabelle (compresi molti esercizi pratici!). Fa parte del percorso SQL Fundamentals che vi aiuterà a portare le vostre conoscenze di SQL a un livello superiore.

O forse conoscete già un po' di SQL e volete saperne di più sulle JOIN. In questo caso, vi suggerisco di dare un'occhiata a Come imparare SQL JOINs, a SQL JOIN Types Explained e al nostro SQL JOIN Cheat Sheet. Potete anche seguire il nostro corso SQL JOINs . Poi mettete in pratica ciò che sapete utilizzando il nostro percorso di apprendimento online SQL Practice . Buon apprendimento!