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

INNER JOIN vs. OUTER JOIN: qual è la differenza?

Decidere quando utilizzare INNER JOIN e OUTER JOIN è spesso una sfida per i principianti. In questo articolo troverete spiegazioni ed esempi che vi aiuteranno a capire meglio la differenza tra queste due unioni.

In SQL, JOINs consente di combinare dati provenienti da tabelle diverse; INNER JOIN e OUTER JOIN sono semplicemente tipi di istruzioni JOIN. Comprendere le loro differenze è fondamentale se si lavora con i database relazionali. È anche fondamentale se dovete affrontare un colloquio di lavoro in SQL: la differenza tra INNER JOIN e OUTER JOIN è una delle domande più frequenti che vengono poste ai colloqui in SQL.

Per ripassare le conoscenze di JOINs, vi consiglio il nostro corso interattivo SQL JOIN. Troverete 93 esercizi pratici che coprono tutti i diversi casi d'uso di INNER JOIN rispetto a OUTER JOIN. Inoltre, imparerete come filtrare correttamente i dati con le diverse varianti di JOIN e come combinare tabelle con colonne non chiave.

Che cos'è una JOIN in SQL?

Cominciamo con l'esaminare un esempio di base di SQL JOIN.

Immaginiamo di avere un database universitario con le tabelle student e lecturer. Nella tabella student abbiamo il campo opzionale advisor_id che memorizza l'ID del docente che è il relatore della tesi dello studente. Uno studente può non avere un relatore se non sta ancora scrivendo la tesi.

Per visualizzare i nomi degli studenti e dei loro consulenti, si usa l'istruzione JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

I dati risultanti potrebbero avere questo aspetto:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez

L'istruzione JOIN viene dopo la clausola FROM: si mette il nome della prima tabella dopo FROM, poi la parola chiave JOIN, poi il nome dell'altra tabella, seguita dalla parola chiave ON e dalla condizione JOIN. Nel nostro caso, la condizione JOIN è student.advisor_id = lecturer.id.

Questa query restituisce le righe in cui il nome advisor_id nella tabella student corrisponde a id nella tabella lecturer tabella. In pratica, restituisce i nomi degli studenti insieme ai nomi dei loro consulenti.

Per un futuro riferimento a tutti i tipi di JOIN, si consiglia di tenere tra i preferiti o di stampare la nostra scheda informativa sulle JOIN di SQL.

Che cos'è un INNER JOIN?

Quando si usa la parola chiave JOIN in SQL, in realtà si sta eseguendo una INNER JOIN. Una INNER JOIN restituisce tutte le combinazioni di righe delle due tabelle che soddisfano la condizione ON. Nel nostro esempio, ha restituito i nomi degli studenti e dei loro consulenti.

Tuttavia, un INNER JOIN non è sufficiente se si vogliono includere le righe che non hanno una corrispondenza nell'altra tabella. Ad esempio, si potrebbe voler visualizzare i nomi di tutti gli studenti, anche quelli che non hanno ancora un consulente. O forse si vogliono includere i nomi di tutti i docenti, anche di quelli che non hanno ancora un consulente. In questo caso entra in gioco OUTER JOIN.

Che cos'è un OUTER JOIN?

Una OUTER JOIN è un tipo di JOIN che restituisce le righe corrispondenti delle due tabelle più tutte le righe non corrispondenti di una (o talvolta di entrambe) le tabelle. OUTER JOIN ha tre varianti: LEFT OUTER JOIN, RIGHT OUTER JOIN, e FULL OUTER JOIN. Esaminiamo ciascuna di esse.

JOIN ESTERNO SINISTRO

LEFT OUTER JOIN (o semplicemente LEFT JOIN) restituisce tutte le righe della tabella di sinistra (la tabella a sinistra dell'istruzione JOIN, cioè subito dopo FROM) con i dati corrispondenti della tabella di destra (la tabella a destra (cioè subito dopo) dell'istruzione JOIN ). Se non c'è corrispondenza, le colonne provenienti dalla tabella di destra vengono riempite con NULL.

Utilizzando i comandi student e lecturer come esempio, possiamo usare LEFT JOIN per ottenere un elenco di tutti gli studenti con i dati del loro consulente. Vogliamo includere tutti gli studenti, anche quelli che non hanno ancora un consulente. La query si presenta in questo modo:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

I risultati sono:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL

Nei risultati, possiamo vedere una riga che non era stata inclusa in precedenza. Lo studente Diana Prince non ha un consulente, quindi non è stato incluso nei risultati della query INNER JOIN. Tuttavia, con la query LEFT JOIN, viene inclusa. LEFT JOIN include tutte le righe della tabella di sinistra, anche quelle che non hanno una riga corrispondente nella tabella di destra. Le colonne che provengono dalla tabella lecturer tabella sono indicate come NULL.

Per ulteriori informazioni, leggete questo articolo sulle LEFT OUTER JOIN in SQL.

JOIN ESTERNO DESTRO

RIGHT OUTER JOIN (o semplicemente RIGHT JOIN) restituisce tutte le righe della tabella di destra (la seconda tabella) con i dati corrispondenti della tabella di sinistra (la prima tabella). Se non c'è corrispondenza, le colonne provenienti dalla tabella di sinistra vengono riempite di null.

Supponiamo di voler elencare i docenti con i dati degli studenti a cui prestano consulenza. Vogliamo includere tutti i docenti, anche quelli che non forniscono consulenza a nessuno studente. Scriveremo quindi una query come questa:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS lecturer_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

Il risultato di questa query è:

student_namelecturer_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

L'uso di RIGHT JOIN nella query ci permette di ottenere un elenco di tutti i docenti, indipendentemente dal fatto che siano assegnati o meno a studenti. Se un docente è assegnato a uno studente, viene elencato con il nome dello studente. Se un docente non è assegnato a nessuno studente, i dati degli studenti nel set di risultati sono NULL.

Consultate questa guida completa alle Join SQL per ottenere tutte le risorse necessarie per comprendere appieno questo argomento.

JOIN ESTERNO COMPLETO

FULL OUTER JOIN (o semplicemente FULL JOIN) consente di ottenere tutti i dati da entrambe le tabelle, indipendentemente dal fatto che ci sia o meno una corrispondenza tra le loro righe. Nel nostro esempio, l'uso di FULL JOIN tra le tabelle student e lecturer restituisce tutti gli studenti e tutti i docenti. La query avrebbe il seguente aspetto:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
FULL JOIN lecturer
ON student.advisor_id = lecturer.id;

E i risultati sarebbero:

student_nameadvisor_name
Alice JohnsonAmina Patel
Michael SmithSantiago Rivera
Bob SmithJessica Martinez
Charlie BrownJessica Martinez
Diana PrinceNULL
NULLKeiko Tanaka
NULLJamal Al-Fayed
NULLNadia Kowalski

Nel risultato si possono vedere tutti gli studenti e tutti i docenti. Se uno studente non ha un consulente, i dati del consulente sono NULL. Se un docente non è assegnato a nessuno studente, i dati dello studente corrispondente sono NULL.

Trovate altri esempi e mettete alla prova le vostre conoscenze con queste 12 domande di esercitazione su SQL JOIN.

Alcuni sistemi di gestione di database relazionali (RDBMS), come MySQL e MariaDB, non supportano FULL JOIN. È possibile ottenere lo stesso risultato in questi DBMS, ma la query è un po' più lunga.

Il modo per creare un FULL JOIN nelle versioni di SQL che non supportano questo comando è quello di usare UNION tra INNER JOIN, LEFT JOIN e RIGHT JOIN:

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id

UNION
SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id

SELECT
  student.full_name AS student_name,
  lecturer.full_name AS advisor_name
FROM student
RIGHT JOIN lecturer
ON student.advisor_id = lecturer.id;

Nello script precedente, l'unione delle tre forme di JOIN - LEFT JOIN, INNER JOIN e RIGHT JOIN - produce gli stessi dati di una FULL JOIN negli RDBMS che la supportano.

Quando vi sembrerà di aver capito SQL JOIN, leggete queste domande e risposte di SQL JOIN per verificare se siete pronti per il colloquio di lavoro.

Sintesi di INNER JOIN vs. OUTER JOIN

Possiamo sintetizzare quanto appreso su INNER JOIN e OUTER JOIN nella seguente tabella:

 

INNER JOIN

OUTER JOIN

Spiegazione

Restituisce le righe dalle due tabelle in cui è soddisfatta la condizione ON.

Restituisce le righe delle due tabelle in cui è soddisfatta la condizione ON E anche i record non corrispondenti di una o entrambe le tabelle, riempiendo con valori nulli dove non esistono corrispondenze.

Tipi

1 tipo: JOIN

3 tipi diversi: LEFT JOIN, RIGHT JOIN, FULL JOIN

Abbreviazione

JOIN = INNER JOIN

LEFT JOIN = LEFT OUTER JOIN
RIGHT JOIN = RIGHT OUTER JOIN
FULL JOIN = FULL OUTER JOIN

Esempio

SELECT
 student.full_name,
  lecturer.full_name
FROM student
JOIN lecturer
ON student.advisor_id = lecturer.id;

SELECT  student.full_name,
  lecturer.full_name
FROM student
LEFT JOIN lecturer
ON student.advisor_id = lecturer.id;

Per maggiori dettagli, consultate questo elenco di sette esempi di JOIN SQL con relative spiegazioni.

Dove saperne di più su INNER JOIN e OUTER JOIN

Ora che conoscete le differenze tra INNER JOIN e OUTER JOIN, potete scrivere query accurate che generano informazioni affidabili e precise. Con la pratica, sarete in grado di affrontare qualsiasi domanda di un colloquio SQL sulle differenze tra INNER JOIN e OUTER JOIN.

Prima di partire, vi consiglio il nostro SQL JOIN se volete approfondire le vostre conoscenze. Alla fine del corso, conoscerete i diversi modi per ottenere dati combinati da più tabelle. E capirete come scegliere l'opzione migliore per ogni scenario.

Ora tocca a voi iniziare a informarvi sulle differenze tra INNER JOIN e OUTER JOIN. Buon apprendimento!