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

Cos'è una JOIN COMPLETA e quando usarla

Impariamo a conoscere la FULL JOIN, come si implementa, come si confronta con gli altri tipi di SQL JOINs e alcuni dei suoi casi d'uso unici.

Prima di addentrarci nelle JOIN COMPLETE, ricapitoliamo rapidamente cos'è una JOIN SQL. In sostanza, una JOIN combina i dati di due o più tabelle all'interno di un database. Le tabelle sono solitamente collegate tra loro utilizzando identificatori unici in ogni tabella, ovvero chiavi primarie e straniere.

Per mostrare un semplice SQL JOIN - noto anche come INNER JOIN - in azione, consideriamo le query Products e OrderDetails del noto database di esempio Northwind. La tabella Products contiene un elenco di tutti i prodotti e la tabella OrderDetails contiene un elenco di tutti gli ordini recenti.

PRODUCTS
ProductIDProductNameSupplierIDCategoryIDUnitPrice
1Chais1110 boxes x 20 bags18
2Chang1124 - 12 oz bottles19
3Aniseed Syrup1212 - 550 ml bottles10
..................

ORDERDETAILS
OrderDetaiIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
............

Ecco la query:

SELECT 
Products.ProductName, OrderDetails.OrderID, OrderDetails.Quantity
FROM Products
JOIN OrderDetails 
ON Products.ProductID=OrderDetails.ProductID
ORDER BY Quantity Desc;

E il risultato:

ProductNameOrderIDQuantity
Pâté chinois10398120
Steeleye Stout10286100
Sirop d'érable1044090

L'esempio precedente utilizza ProductID (che è disponibile in entrambe le tabelle) come chiave per unire le due tabelle e visualizzare ogni ordine ordinato in ordine decrescente per Quantity. Si noti che un semplice JOIN come quello sopra riportato restituisce solo le righe corrispondenti delle due tabelle. In questo caso, i risultati includeranno solo i prodotti ordinati di recente e gli ordini collegati a un ProductID valido.

GIUNZIONE COMPLETA

JOIN COMPLETO: introduzione

A differenza di INNER JOIN, una FULL JOIN restituisce tutte le righe di entrambe le tabelle unite, indipendentemente dal fatto che abbiano o meno una riga corrispondente. Per questo motivo, una FULL JOIN viene anche chiamata FULL OUTER JOIN. Un FULL JOIN restituisce le righe non corrispondenti di entrambe le tabelle e la loro sovrapposizione. Quando non esistono righe corrispondenti per una riga della tabella di sinistra, le colonne della tabella di destra avranno NULL per quei record. Allo stesso modo, quando non esistono righe corrispondenti per una riga della tabella di destra, le colonne della tabella di sinistra avranno dei NULL.

Per dimostrare la differenza tra un semplice SQL JOIN e un FULL OUTER JOIN, consideriamo le tabelle Projects e Employees come mostrato di seguito. La tabella Projects contiene un elenco di tutti i progetti intrapresi dall'azienda (progetti interni e in outsourcing), mentre la tabella Employees contiene un elenco di tutti i dipendenti attuali e specifica se sono coinvolti in qualche progetto aziendale.

PROJECTS
ProjectIDProjectNameCostYTDBusinessUnit
1CRM Upgrade45640Customer Relations
2Cybersecurity Protocol Implementation80200Cybersecurity
3HQ Office Renovations145000Facilities
4ERP Integration110000Corporate
5Database Stack Upgrade25000Engineering
............
15Automated QA10000Engineering

EMPLOYEES
EmployeeIDEmployeeNameProjectIDStartDateBusinessUnit
001Albert Ross32012-02-11Facilities
002Hummer BairdNULL2012-02-11Corporate
003Matthias Dias152012-07-15Engineering
004Al Cooper12014-04-15Customer Relations
005Macron RalfNULL2014-04-15Legal
...............
025Hamza ImranNULL2020-07-11Engineering

Se si effettuassero delle JOIN tra queste due tabelle facendo corrispondere le tabelle attraverso ProjectID come chiave primaria, i risultati di una semplice INNER JOIN e di una FULL OUTER JOIN sarebbero molto diversi. Un INNER JOIN produrrebbe una tabella contenente solo i risultati in cui c'è una corrispondenza tra le due voci corrispondenti in entrambe le tabelle. Il risultato di INNER JOIN contiene i nomi dei dipendenti e i nomi dei progetti corrispondenti:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Matthias DiasAutomated QA
Al CooperCRM Upgrade

Invece, un FULL OUTER JOIN produrrà i dati di entrambe le tabelle, indipendentemente dalla presenza di una corrispondenza nell'altra tabella:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

Il risultato di FULL JOIN contiene tutti i nomi dei dipendenti, indipendentemente dal fatto che siano assegnati a un progetto, e tutti i nomi dei progetti, anche se non ci sono dipendenti assegnati a quel progetto.

Sintassi della JOIN COMPLETA

La sintassi di base di FULL JOIN è simile a quella di altri tipi di JOIN:

SELECT 
	left_table.column1, right_table.column2,...
FROM left_table
FULL OUTER JOIN right_table 
ON left_table.key = right_table.key;

La parola chiave OUTER è opzionale e può essere omessa.

Esempio

Esaminiamo ora l'esempio di una FULL OUTER JOIN che mostra sia la EmployeeName che la ProjectName. Ecco la query:

SELECT 
Employees.EmployeeName, Projects.ProjectName
FROM Employees
FULL OUTER JOIN Projects 
ON Employees.ProjectID=Projects.ProjectID
ORDER BY EmployeeID;

E il risultato:

EmployeeNameProjectName
Albert RossHQ Office Renovations
Hummer BairdNULL
Matthias DiasAutomated QA
Al CooperCRM Upgrade
.......
Hamza ImranNULL
NULLERP Integration

Dalla tabella dei risultati si evince che anche FULL JOIN produce risultati NULL da entrambi i metodi Projects e Employees anche se non c'erano corrispondenze nell'altra tabella. I NULL nella colonna ProjectName indicano che il dipendente non è specificamente assegnato ad alcun progetto e probabilmente svolge altre funzioni in azienda. D'altra parte, un NULL nella colonna EmployeeName indica che il progetto specifico è probabilmente esternalizzato e non gestito direttamente da un dipendente dell'azienda. In alternativa, un valore NULL potrebbe anche indicare un potenziale errore o una cancellazione involontaria di dati nel database o nel sistema. (Ne parleremo più avanti).

È bene notare che alcuni database, come MySQL, non supportano i join completi. In questo caso, è possibile utilizzare l'operatore UNION ALL per combinare le query LEFT JOIN e RIGHT JOIN.

Il nostro precedente articolo su SQL JOINs contiene altri esempi da esaminare. Il nostro SQL JOINs corso fornisce anche esempi completi di FULL JOINs e include esercizi pratici per migliorare le vostre conoscenze.

Casi d'uso della giunzione completa

Rispetto agli altri tipi di SQL JOINs, è probabile che FULL JOIN venga utilizzato meno frequentemente. Detto questo, è uno strumento molto utile per alcune situazioni particolari. Alcuni dei suoi casi d'uso sono:

  • Per recuperare tutti i record da entrambe le tabelle, indipendentemente dal fatto che vi sia o meno una corrispondenza. Questo è l'esempio che abbiamo visto sopra.
  • Per trovare dati non corrispondenti o orfani da entrambe le tabelle. Un record orfano è un record il cui valore di chiave esterna fa riferimento a un valore di chiave primaria inesistente; ciò accade spesso in sistemi in rapida espansione o molto vecchi.
  • Eseguire rapporti di eccezione. Si tratta di una forma di analisi dei dati che confronta un insieme di dati con un insieme di dati di base desiderato/previsto, evidenziando gli elementi che non corrispondono.

Sebbene l'applicazione delle JOIN COMPLETE sia piuttosto particolare, sono un ottimo modo per trovare e diagnosticare potenziali problemi di integrità dei dati.

Tipi di JOIN: Riepilogo

Come abbiamo detto sopra, esistono altri tipi di JOIN.

Una INNER JOIN restituisce le righe quando la condizione JOIN è soddisfatta sia nella tabella di sinistra che in quella di destra. In altre parole, restituisce solo i record corrispondenti delle tabelle. Questo è il tipo più comune di JOIN SQL ed è quello predefinito quando non viene specificato il tipo di JOIN.

Un OUTER JOIN restituisce tutte le righe di una tabella e alcune o tutte le righe di un'altra tabella (a seconda del tipo di OUTER JOIN). Oltre a FULL OUTER JOIN, esistono altri due tipi:

  • A LEFT OUTER JOIN restituisce tutte le righe della tabella di sinistra, anche se non sono state trovate righe corrispondenti nella tabella di destra. Se non ci sono record corrispondenti nella tabella di destra, la query restituirà valori NULL per le colonne.
  • Un RIGHT OUTER JOIN restituisce tutte le righe della tabella giusta. Se non ci sono record corrispondenti nella tabella di sinistra, vengono restituiti i valori NULL per quelle colonne - l'inverso di un LEFT JOIN.

Una CROSS JOIN (chiamata anche JOIN cartesiana) restituisce ogni possibile combinazione di righe delle tabelle unite. Poiché restituisce tutte le combinazioni possibili, questo è l'unico tipo JOIN che non necessita di una condizione JOIN e quindi non richiede una clausola ON.

Per uno sguardo più dettagliato su ciascuno dei tipi di JOIN, consultate l'articolo SQL JOIN Types Explained. Inoltre, il nostro SQL JOINs copre tutti i diversi tipi e casi d'uso delle JOIN in modo molto dettagliato. Approfondisce anche argomenti più avanzati, come i JOIN non equi e i JOIN multipli.

Le JOIN sono una delle funzioni fondamentali e più comunemente utilizzate di SQL e una parte essenziale del kit di strumenti di qualsiasi utente di SQL. Sono presenti anche nelle domande più comuni dei colloqui di lavoro; consultate il nostro articolo Le 10 principali domande di colloquio sulle JOIN in SQL e come rispondere per avere suggerimenti utili.

Aumentate la vostra conoscenza delle JOIN COMPLETE in SQL

In questo tutorial avete appreso le specifiche di SQL FULL JOINs e i loro casi d'uso principali nella diagnosi dell'integrità dei dati. È stato anche fatto un breve confronto tra FULL JOINs e gli altri tipi di JOIN.

Per comprendere davvero FULL JOINs, è necessario immergersi in profondità, fare qualche esercizio e mettersi alla prova. Consiglio vivamente di provare il nostro corso SQL JOINs per passare al livello successivo di questa importantissima funzione di SQL.