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

Che cos'è il FULL JOIN in SQL? Spiegazione con 4 esempi

Che cos'è la FULL JOIN, uno dei tipi di join SQL spesso trascurati? In questo articolo vi mostreremo quanto può essere utile FULL JOIN e vi insegneremo come applicarlo a diversi scenari. I quattro esempi coprono alcuni degli usi tipici.

Una join SQL è una costruzione per combinare i dati di due o più tabelle. FULL JOIN è uno dei tipi di join. Questo articolo è utile se si ha già familiarità con le unioni SQL e il loro funzionamento. In caso contrario, o se le vostre conoscenze devono essere rinfrescate, vi consigliamo di seguire il nostro corso interattivo per colmare le lacune. SQL JOINs interattivo per colmare le lacune. Vi aspettano novantatré esercizi in cui potrete riepilogare i tipi di join ed esercitarvi a filtrare i dati utilizzando join singoli e multipli, self-join e join non equi.

Che cos'è una giunzione completa?

FULL JOIN o FULL OUTER JOIN (SQL li accetta entrambi) è un join esterno. In SQL, una join esterna è un tipo di join che include le righe non corrispondenti di una o entrambe le tabelle unite; anche LEFT JOIN e RIGHT JOIN sono join esterne. FULL JOIN è un'unione di LEFT JOIN e RIGHT JOIN: mostra le righe corrispondenti e quelle non corrispondenti di entrambe le tabelle. Quando i valori di una tabella non trovano corrispondenza nell'altra tabella, FULL JOIN restituisce NULLs. Visivamente, può essere rappresentata come segue:

FULL JOIN in SQL

Sintassi della giunzione completa

La sintassi di FULL JOIN è la seguente:

SELECT …
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

Come di consueto per le giunzioni SQL, le parti principali della sintassi FULL JOIN sono le clausole JOIN e ON. La prima tabella nella clausola FROM è seguita dalla parola chiave FULL JOIN, che unisce la seconda tabella. La condizione per cui le tabelle vengono unite è specificata nella clausola ON. Di solito, le tabelle vengono unite su una colonna condivisa tra loro, ad esempio la colonna id nella tabella writer e la colonna writer_ID della tabella book della tabella. Queste due colonne avranno gli stessi valori grazie alla relazione chiave primaria-chiave esterna.

In un semplice esempio, possiamo scrivere questo codice e ottenere il seguente risultato:

Altri tipi di join in SQL

Abbiamo già detto che FULL JOIN è solo uno dei diversi tipi di join in SQL. Ecco l'elenco completo:

  • (INNER) JOIN
  • LEFT (OUTER) JOIN
  • RIGHT (OUTER) JOIN
  • FULL (OUTER) JOIN
  • CROSS JOIN

JOIN (o INNER JOIN) è un tipo di join interno che restituisce solo le righe corrispondenti delle tabelle unite. Per saperne di più sulle INNER JOIN, consultare il sito.

LEFT JOIN (o LEFT OUTER JOIN) elenca tutte le righe della prima tabella (sinistra) e solo le righe corrispondenti della seconda tabella (destra). Se non ci sono righe corrispondenti nella tabella di destra, i valori vengono mostrati come NULL. Per saperne di più, consultare il nostro articolo sul LEFT JOIN.

RIGHT JOIN (o RIGHT OUTER JOIN) è l'immagine speculare di LEFT JOIN. Restituisce tutte le righe della seconda tabella (destra) e solo le righe corrispondenti della prima tabella (sinistra). Se nella tabella di sinistra ci sono righe non corrispondenti, i valori sono NULL.

Ora si può capire meglio perché abbiamo detto che FULL JOIN è l'unione di LEFT JOIN e RIGHT JOIN. Poiché mostra tutti i dati delle tabelle di destra e di sinistra e anche le righe non corrispondenti, è come se si usassero LEFT JOIN e RIGHT JOIN allo stesso tempo.

CROSS JOIN restituisce un prodotto cartesiano. In altre parole, restituisce tutte le combinazioni di tutte le righe di entrambe le tabelle unite.

Esempi di JOIN COMPLETA

Passiamo ora agli esempi che illustrano l'uso tipico di FULL JOIN.

Esempio 1: Mostrare tutti i dipendenti e i reparti dell'azienda

Compito: È necessario mostrare tutti i dipendenti di un'azienda, anche se non hanno un reparto assegnato. È inoltre necessario mostrare tutti i reparti, anche se non vi sono dipendenti assegnati.

Set di dati: Per risolvere il problema utilizzeremo due tabelle. La prima tabella è quella dei dipartimenti (lo script è qui), che è un elenco dei dipartimenti dell'azienda:

iddepartment_name
1IT
2Accounting
3Sales

La seconda tabella è dipendenti, con i dati mostrati di seguito. Lo script è qui:

idfirst_namelast_namedepartment_id
1SarahZimmerman2
2ThomasTyson1
3DanielRichardson1
4SofiaTardelli2
5MarkFitzpatrick4

Soluzione:

SELECT 
  first_name,
  last_name,
  department_name
FROM employees e
FULL JOIN department d
  ON e.department_id = d.id;

Spiegazione: Il codice seleziona il nome e il cognome dei dipendenti e il nome del reparto.

È possibile farlo perché FULL JOIN le due tabelle. Facciamo riferimento alla tabella employees in FROM e le diamo un alias. Poi, facciamo riferimento alla seconda tabella, departmentin FULL JOIN. Le tabelle vengono unite in base agli ID dei reparti presenti in entrambe le tabelle. Questa condizione di unione è scritta nella clausola ON.

Output: L'output restituisce tutti i dati di entrambe le tabelle. Ci sono alcune righe interessanti che devono essere elaborate.

Mark Fitzpatrick non ha un reparto - il suo valore department_id valore è 5, ma non c'è nessun reparto con ID 5 nella tabella department. Pertanto, sotto il nome del reparto c'è un valore NULL. Questo potrebbe essere dovuto al fatto che si tratta di un nuovo dipendente e che la tabella non è stata aggiornata con il employees tabella non è stata aggiornata con i dati del reparto.

Inoltre, l'ultima riga mostra il reparto Vendite, ma non il nome del dipendente. Ciò indica che il reparto Vendite non ha dipendenti. Non c'è nulla di strano, perché abbiamo saputo che tutti e tre i dipendenti del reparto Vendite hanno recentemente lasciato l'azienda.

first_namelast_namedepartment_name
SarahZimmermanAccounting
ThomasTysonIT
DanielRichardsonIT
SofiaTardelliAccounting
MarkFitzpatrickNULL
NULLNULLSales

Esempio 2: Mostrare tutti i clienti con il numero di prodotti acquistati e il numero di prodotti senza vendite

Compito: C'è un negozio di dischi sul web che vende vinili (cioè dischi musicali). Il compito è elencare tutti i clienti e trovare il numero di vinili acquistati da ciascun cliente. L'output deve mostrare anche il numero di vinili che nessuno ha ancora acquistato.

Set di dati: Lavoreremo con tre tabelle. La prima è customercon lo script qui:

idfirst_namelast_name
1MarvinSimmons
2MarianneDickens
3SusanStrozzi

Lo script per la seconda tabella, vinyl, si trova qui. La tabella mostra l'elenco dei vinili, come si può vedere qui sotto:

idartistalbum_nameprice
1Callier, TerryWhat Color is Love24.99
2Guy, BuddySweet Tea32.99
3Little SimzA Curious Tale of Trials32.99
4LaVette, BettyeScene of the Crime36.99

La terza tabella è una tabella di giunzione chiamata purchase. Lo script è disponibile qui:

idcustomer_idvinyl_idpurchase_date
1122023-01-03
2132023-01-12
3122023-02-18
4132023-03-01
5232023-03-01
6222023-04-01
7242023-05-01

Soluzione:

SELECT 
  first_name,
  last_name,
  COUNT (v.id) AS vinyl_count	   
FROM customer c
FULL JOIN purchase p
  ON c.id = p.customer_id
FULL JOIN vinyl v
  ON p.vinyl_id = v.id
GROUP BY first_name, last_name;

Spiegazione: Questo è un esempio di utilizzo di FULL JOIN e di unione di più di due tabelle.

La query seleziona i nomi dei clienti. Quindi, utilizza la funzione aggregata COUNT() per trovare il numero di vinili acquistati. FULL JOIN la tabella customer con la tabella purchase tabella. Questa operazione viene eseguita sugli ID dei clienti in entrambe le tabelle.

Ora dobbiamo unire la terza tabella. È semplice: scrivere di nuovo FULL JOIN e fare riferimento alla tabella vinyl. Ora è possibile unirla alla tabella purchase sugli ID dei vinili.

Risultato: L'output mostra che c'è un vinile che nessuno ha ancora ordinato. È possibile riconoscerlo dai NULL.

Mostra anche un elenco di tutti i clienti e il numero di vinili che hanno acquistato. Susan Strozzi non ha comprato nulla. Marianne Dickens e Marvin Simmons hanno acquistato rispettivamente tre e quattro vinili.

first_namelast_namevinyl_count
NULLNULL1
SusanStrozzi0
MarianneDickens3
MarvinSimmons4

Esempio 3: elencare tutte le coppie studente-certificazione e i voti degli studenti

Compito: Lavorate per una piattaforma di certificazione SQL online. Offre diverse certificazioni; ogni anno c'è una nuova edizione di ogni certificazione. Trovare tutte le possibili coppie studente-certificazione e il voto ottenuto da ogni studente in tutte le edizioni della certificazione.

Set di dati: Il set di dati è in aumento; ora comprende quattro tabelle. La prima tabella è student; qui c'è lo script. È un elenco di studenti della piattaforma:

i nostri vinili, rispettivamente.

idfirst_namelast_name
1TomFrank
2MaryMaddison
3PavelKuba
4AmandaWilson

La seconda tabella è la tabella dei certificati, che contiene l'elenco dei certificati. Ecco lo script:

idcertificate_name
1Microsoft Certified: Azure Data Fundamentals
2Oracle Database SQL Certified Associate Certification
3IBM Certified Database Associate
4MySQL 5.7 Database Administrator Certification
5EDB PostgreSQL 12 Associate Certification

La tabella successiva è una tabella di giunzione chiamata certificate_enrollment

idstudent_idedition_idgradepass
121620FALSE
226850TRUE
3210900TRUE
412100FALSE
517500FALSE
617800TRUE
748800TRUE
. Lo script è disponibile qui. La tabella mostra quali studenti si sono iscritti a quale certificato, insieme ai loro voti e al loro superamento:

L'ultima tabella è una tabella di raccordo denominata certificate_edition. Essa mostra l'elenco delle edizioni dei certificati, collegandosi alla tabella certificate. Lo script è qui:

idcertificate_idedition
112022
222022
332022
442022
552022
612023
722023
832023
942023
1052023

Soluzione:

SELECT 
  first_name,
  last_name,
  certificate_name,
  edition,
  grade
FROM student s
FULL JOIN certificate_enrollment cen
  ON s.id = cen.student_id
FULL JOIN certificate_edition ced
  ON cen.edition_id = ced.id
FULL JOIN certificate c
  ON ced.certificate_id = c.id;

Spiegazione: Selezioniamo innanzitutto tutte le colonne rilevanti da tutte e quattro le tabelle: first_name e last_name da student, certificate_name da certificate, edition da certificato_edizione e grade da certificate_enrollment.

Quindi, uniamo le tabelle come negli esempi precedenti. Per prima cosa, la tabella studentFULL JOIN con certificate_enrollment sugli ID degli studenti.

Il secondo FULL JOIN aggiunge la tabella certificate_edition per unirla alla tabella certificate_enrollment. Le tabelle sono unite in base all'ID dell'edizione del certificato.

Ora che abbiamo unito tre tabelle, possiamo aggiungere la quarta. Facciamo riferimento alla tabella certificate in FULL JOIN. La uniamo a certificate_edition in base all'ID del certificato.

Output: L'output mostra esattamente ciò che vogliamo.

C'è un elenco di tutti gli studenti che hanno ricevuto un certificato, la sua edizione e il voto ottenuto da ogni studente. Se il voto è inferiore a 700, lo studente è stato bocciato e ha dovuto ripetere l'esame per il certificato.

Uno studente non si è ancora iscritto a un programma di certificazione: si tratta di Pavel Kuba. Inoltre, ci sono quattro edizioni del certificato senza studenti iscritti.

first_namelast_namecertificate_nameeditiongrade
MaryMaddisonMicrosoft Certified: Azure Data Fundamentals2022620
MaryMaddisonMicrosoft Certified: Azure Data Fundamentals2023850
MaryMaddisonEDB PostgreSQL 12 Associate Certification2023900
TomFrankOracle Database SQL Certified Associate Certification2022100
TomFrankOracle Database SQL Certified Associate Certification2023500
TomFrankOracle Database SQL Certified Associate Certification2023800
AmandaWilsonIBM Certified Database Associate2023800
PavelKubaNULLNULLNULL
NULLNULLEDB PostgreSQL 12 Associate Certification2022NULL
NULLNULLMySQL 5.7 Database Administrator Certification2022NULL
NULLNULLIBM Certified Database Associate2022NULL
NULLNULLMySQL 5.7 Database Administrator Certification2023NULL

Esempio 4: trovare tutte le coppie autore-argomento e mostrare gli articoli e il loro stato

Compito: Lavorate per un'azienda che assume scrittori di articoli per i propri clienti. Esiste un elenco di scrittori e di argomenti offerti. Inoltre, ogni argomento ha attualmente diversi articoli disponibili. Gli scrittori sono assegnati a questi articoli. Un articolo può avere uno dei due stati: "Scrittura" (l'articolo è in fase di scrittura) o "Revisione" (l'articolo è in fase di revisione).

Trovare tutte le coppie scrittore-argomento. Inoltre, elencare tutti gli articoli e il loro stato.

Set di dati: Anche questo dataset è composto da quattro tabelle. La prima tabella è writercon lo script collegato qui:

idfirst_namelast_name
1VictoriaThompson
2MikeMcGill
3SkyHerrera
4JimmyGoodman

La tabella successiva è topic. Ecco lo script:

idtopic_name
1SQL
2Python
3ML
4SQL Careers
5Python Careers

La terza tabella è article_assignment. Collega lo scrittore con l'articolo e mostra lo stato attuale dell'articolo. Ecco lo script:

idwriter_idarticle_idstatus
143Revising
241Writing
335Writing
438Revising
5310Revising
617Writing

La quarta tabella collega l'articolo con l'argomento. Si chiama articlee lo script è qui:

idarticle_titletopic_id
1What is FULL JOIN in SQL? An Explanation with 4 Examples1
2Pandas in Python2
3Supervised Learning3
4Basic SQL Interview Questions4
5Basic Python Interview Questions5
6SQL Window Functions1
7Ranking Data in Python2
8Unsupervised Learning3
9Intermediate SQL Interview Questions4
10Intermediate Python Interview Questions5

Soluzione:

SELECT 
  first_name,
  last_name,
  topic_name,
  article_title,
  status
FROM writer w
FULL JOIN article_assignment aa
  ON w.id = aa.writer_id
FULL JOIN article a
  ON aa.article_id = a.id
FULL JOIN topic t
  ON a.topic_id = t.id;

Spiegazione: La query è simile alla precedente. Seleziona tutte le colonne rilevanti: il nome dello scrittore, l'argomento, il titolo dell'articolo e il suo stato. Successivamente, unisce le tabelle writer e article_assignment sull'ID dello scrittore utilizzando FULL OUTER JOIN.

Un altro FULL JOIN aggiunge la terza tabella article e la unisce all'ID dell'articolo. Infine, la quarta tabella viene unita all'ID dell'argomento.

Output: Ecco un elenco di tutti gli autori, gli argomenti, gli articoli e gli stati.

Gli argomenti di Jimmy Goodman sono ML e SQL. Sky Herrera scrive di carriere Python e ML. Victoria Thompson scrive solo di Python.

Mike McGill non ha articoli assegnati. Inoltre, ci sono un articolo su Python, uno su SQL e due su SQL Career non assegnati a nessuno scrittore.

first_namelast_nametopic_namearticle_titlestatus
JimmyGoodmanMLSupervised LearningRevising
JimmyGoodmanSQLWhat is FULL JOIN in SQL? An Explanation with 4 ExamplesWriting
SkyHerreraPython CareersBasic Python Interview QuestionsWriting
SkyHerreraMLUnsupervised LearningRevising
SkyHerreraPython CareersIntermediate Python Interview QuestionsRevising
VictoriaThompsonPythonRanking Data in PythonWriting
MikeMcGillNULLNULLNULL
NULLNULLPythonPandas in PythonNULL
NULLNULLSQLSQL Window FunctionsNULL
NULLNULLSQL CareersBasic SQL Interview QuestionsNULL
NULLNULLSQL CareersIntermediate SQL Interview QuestionsNULL

No FULL JOIN, No SQL Mastery

FULL JOIN Probabilmente non è usato così spesso come JOIN o LEFT JOIN. È un'unione umile che aspetta fino a quando non è necessario per brillare. Ma senza di essa nel vostro repertorio, non potete definirvi un maestro di SQL.

Gli esempi precedenti hanno mostrato scenari pratici in cui è necessario utilizzare tutti i dati di due (o più) tabelle. FULL JOIN lo rende davvero facile!

Naturalmente, è necessario fare ancora un po' di pratica, poiché la parte più importante dell'uso delle join SQL è decidere quale join usare. Una volta acquisita la padronanza di questo aspetto, le join diventano facili: la sintassi è la stessa, indipendentemente dal tipo di join utilizzato. Il nostro SQL JOINs può aiutarvi a padroneggiare JOIN, perché è ricco di esercizi pratici. Lo stesso vale per il nostro articolo di esercitazione sulle unioni SQL con 12 esempi. Dopo aver imparato tutto questo, anche le domande del colloquio SQL JOIN non saranno difficili da rispondere.

Ora sta a voi utilizzare tutte queste risorse per padroneggiare FULL JOIN!