16th Dec 2024 Tempo di lettura: 8 minuti INNER JOIN vs. OUTER JOIN: qual è la differenza? Gustavo du Mortier join Indice Che cos'è una JOIN in SQL? Che cos'è un INNER JOIN? Che cos'è un OUTER JOIN? JOIN ESTERNO SINISTRO JOIN ESTERNO DESTRO JOIN ESTERNO COMPLETO Sintesi di INNER JOIN vs. OUTER JOIN Dove saperne di più su INNER JOIN e OUTER JOIN 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! Tags: join