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

Che cos'è l'OUTER JOIN in SQL?

Anche se non siete esperti di SQL, vi sarete sicuramente imbattuti nel termine OUTER JOIN. In questo articolo vi spiegherò cosa fanno le OUTER JOIN in SQL. Utilizzerò alcuni esempi pratici per dimostrare come viene utilizzato nelle applicazioni quotidiane di SQL.

Se si desidera utilizzare SQL per scopi pratici, è estremamente importante conoscere le diverse JOINs. In effetti, si utilizzerà una JOIN in quasi tutte le query che si scriveranno. Pertanto, è indispensabile dedicare un po' di tempo a familiarizzare con essi.

Sebbene questo articolo contenga alcune informazioni di base su JOIN in generale e su OUTER JOIN in particolare, raccomando agli studenti più seri di seguire il corso di SQL JOINs di LearnSQL.it. Si tratta di un gruppo interattivo di 93 esercizi pratici suddivisi in 5 sezioni, che vi permetterà di comprendere a fondo le JOIN SQL.

Detto questo, entriamo subito nel vivo dell'argomento, iniziando da cosa fa un JOIN SQL.

Che cos'è una JOIN?

Un SQL JOIN viene utilizzato per combinare i dati di due o più tabelle e generare un'unica tabella di output contenente le colonne selezionate da entrambe le tabelle. Di solito si utilizzano uno o più valori comuni nelle tabelle per collegarle. Nella condizione JOIN si specifica come combinare le righe di due tabelle: le righe di entrambe le tabelle che soddisfano la condizione vengono combinate e aggiunte alla tabella dei risultati.

Per esempio, supponiamo di avere un database di informazioni sui clienti. Quando un cliente si registra presso la vostra azienda, salvate i suoi dati (Customer_Number, Customer_Name, Age, Postal_Code, e Address) in una tabella denominata customers. I dettagli degli ordini che il cliente effettua vengono memorizzati in un'altra tabella chiamata orders, che contiene i dati Order_Number, Order_Date, Expected_Shipping_Date, e Customer_Number.

Immaginiamo che un cliente effettui un ordine e che sia necessario conoscere l'indirizzo di consegna. Tuttavia, la tabella orders contiene solo l'indirizzo Customer_Number. Per recuperare l'indirizzo del cliente, è necessario JOIN le tabelle customers e orders sulla base di Customer_Number.

In questo caso, Customer_Number serve come valori delle colonne da confrontare.

customers:

Customer_NumberCustomer_NameAgePostal_CodeAddress
103Atelier274400054, RueRoyal
112Signal32830308489 Strong
114Collector273004636 Kilda
119La Roche274400067, rue chimay
121Baane mini324110Ering Shakkes

orders:

Order_NumberOrder_DateExpected_Shipping_DateCustomer_Number
1034531-01-202210-02-2022103
1034630-01-202215-02-2022112
1012005-02-202216-02-2022114
1032506-02-202210-02-2022121
1121108-02-202221-02-20224110

Ecco la query da utilizzare per collegare tutti i numeri d'ordine con i nomi e gli indirizzi dei clienti:

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code, 
  b.Address 
FROM orders a 
JOIN customers b  
ON a.Customer_Number = b.Customer_Number;

Ed ecco il risultato:

Order_NumberCustomer_NamePostal_CodeAddress
10345Atelier4400054, RueRoyal
10346Signal830308489 Strong
10120Collectors3004636 Kilda
10325Baane Mini4110Ering Shakkes

In questa query, SQL seleziona le colonne Order_Number dalla tabella orders e Customer_Name, Postal_Code, e Address dalla tabella customers Customer_Number è la colonna utilizzata nella condizione JOIN. Per ogni ordine, il numero di cliente corrispondente da orders viene confrontato con il numero di cliente della tabella customers tabella. Per quell'ordine vengono recuperati il nome del cliente, il codice postale e l'indirizzo.

Questo è un classico esempio di INNER JOIN (noto anche come JOIN semplice o regolare; la parola chiave INNER è facoltativa). È una delle JOINs più utilizzate in SQL. INNER JOIN significa che verranno recuperate solo le righe i cui valori sono comuni tra le due tabelle. Si noti che le righe con il numero di cliente 119 (che non ha ordini corrispondenti) e il numero d'ordine 11211 (che non ha un numero di cliente corrispondente) non sono state incluse nel risultato.

Tuttavia, INNER JOIN non è l'unico JOIN che SQL offre. Esistono diversi tipi di OUTER JOIN da conoscere.

Spiegazione delle JOIN OUTER

In SQL, JOINs sono classificate come:

  1. INNER JOIN - Restituisce solo le righe i cui valori corrispondono alla condizione JOIN in entrambe le tabelle. Le righe di una delle due tabelle che non corrispondono a questa condizione vengono ignorate.
  2. OUTER JOIN
    1. LEFT JOIN - Restituisce tutte le righe della tabella di sinistra (la tabella prima della parola chiave JOIN ). Per le righe che hanno una corrispondenza nella tabella di destra, restituisce i valori della tabella di destra; per le righe senza corrispondenza nella tabella di destra, riempie i valori mancanti con NULLs.
    2. RIGHT JOIN - Restituisce tutte le righe della tabella giusta (la tabella dopo la parola chiave JOIN ). Per le righe che hanno una corrispondenza nella tabella di sinistra, restituisce i valori della tabella di sinistra; per le righe senza corrispondenza nella tabella di sinistra, riempie i valori mancanti con NULLs.
    3. FULL JOIN - Restituisce tutte le righe di entrambe le tabelle, utilizzando NULLs per i valori senza corrispondenza.

Per qualsiasi JOIN, la struttura di base della query SQL è la seguente:

<SELECT <list of columns>
FROM <table 1> 
LEFT/RIGHT/FULL/INNER JOIN <table 2> 
ON <join condition>
WHERE <other conditions>;

Nota: al posto della parola chiave LEFT JOIN si può usare in alternativa LEFT OUTER JOIN. La parola chiave OUTER è facoltativa. Allo stesso modo, si può usare RIGHT OUTER JOIN al posto di RIGHT JOIN e FULL OUTER JOIN al posto di FULL JOIN senza che i risultati della query cambino.

OUTER JOIN è usato per recuperare tutti i record dalle tabelle, anche quelli che non hanno alcun valore corrispondente nell'altra tabella in base alla condizione JOIN. In questi casi, restituisce NULL come valore per le colonne mancanti.

L'OUTER JOIN viene utilizzato per recuperare tutti i record dalle tabelle, anche quelli che non hanno un valore corrispondente nell'altra tabella in base alla condizione di JOIN. In questi casi, restituisce NULL come valore per le colonne mancanti.

Come già detto, esistono tre tipi di OUTER JOIN: LEFT OUTER JOIN, RIGHT OUTER JOIN e FULL OUTER JOIN. Vediamo alcuni esempi per dimostrarne il funzionamento.

JOIN ESTERNO SINISTRO

Immaginate di dover recuperare tutti gli ordini insieme alle informazioni sui clienti. Ma è necessario includere anche gli ordini che non hanno informazioni sul cliente. In questo caso, si può usare una join LEFT OUTER JOIN.

Query:


SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
LEFT JOIN customers b -- alternatively use LEFT OUTER JOIN instead of LEFT JOIN
ON a.Customer_Number = b.Customer_Number;

Output:

Order_NumberCustomer_NamePostal_CodeAddress
10345Atelier4400054, RueRoyal
10346Signal830308489 Strong
10120Collectors3004636 Kilda
10325Baane Mini4110Ering Shakkes

Poiché nella query è stato specificato 'LEFT JOIN', la query funziona recuperando prima tutte le righe della tabella di sinistra e poi il valore corrispondente nella tabella di destra. La tabella sinistra è quella indicata prima della parola chiave JOIN (in questo caso, la tabella orders tabella). La query restituisce NULL nelle colonne della tabella di destra (Customer_Name, Postal_Code) per tutte le righe per le quali non esiste un valore Customer_Number corrispondente nella tabella customers. Si noti che il numero d'ordine 11211 (l'ordine senza cliente assegnato) è stato incluso nei risultati, con valori NULL nelle colonne Nome_cliente e Codice postale.

JOIN ESTERNO DESTRO

Una RIGHT OUTER JOIN funziona esattamente all'opposto di una LEFT OUTER JOIN. Recupera tutte le righe dalla tabella di destra (la tabella indicata dopo la parola chiave JOIN ) e i valori corrispondenti dalla tabella di sinistra. Ci sono NULLs per tutte le righe per le quali la tabella di sinistra non ha una corrispondenza. Vediamo un esempio.

Interrogazione:

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
RIGHT JOIN customers b -- alternatively use RIGHT OUTER JOIN instead of RIGHT JOIN
ON a.Customer_Number = b.Customer_Number;

Output:

Order_NumberCustomer_NamePostal_Code
10345Atelier44000
10346Signal83030
10120Collectors3004
10325Baane Mini4110
NULLLa Roche44000

In questo caso, il cliente (La Roche) che non ha effettuato alcun ordine è presente nei risultati della query; l'ordine senza cliente è stato omesso. Questo perché abbiamo usato un RIGHT OUTER JOIN; tutti i record della tabella di destra (customers) sono stati inclusi.

JOIN ESTERNO COMPLETO

Ma cosa succede se si vogliono tutte le righe di entrambe le tabelle? Usare FULL OUTER JOIN. Questo JOIN restituisce tutte le righe di entrambe le tabelle, sostituendo NULL a qualsiasi valore di riga non presente nell'altra tabella.

Query:

SELECT 
  a.Order_Number, 
  b.Customer_Name, 
  b.Postal_Code 
FROM orders a 
FULL JOIN customers b --alternatively use ‘FULL OUTER JOIN’ instead of ‘FULL JOIN’
ON a.Customer_Number = b.Customer_Number;

Risultato:

I risultati includono sia il cliente La Roche (che non ha ordini) sia l'ordine 11211 (che non ha informazioni sul cliente).

Differenza tra INNER e OUTER JOIN

Come avrete capito, la differenza fondamentale tra INNER JOIN e OUTER JOIN è se includere o meno le righe per le quali non c'è corrispondenza nell'altra tabella. Mentre una INNER JOIN restituisce solo le righe in cui c'è una corrispondenza tra le due tabelle, una OUTER JOIN (a seconda del tipo) restituisce anche le righe per le quali non c'è corrispondenza nell'altra tabella.

Pronti a usare le OUTER JOIN nelle vostre query?

Spero che questo articolo vi abbia dato una buona idea di come utilizzare OUTER JOIN. Se volete approfondire l'uso di SQL JOINs, date un'occhiata al corso che ho citato prima. SQL JOINs di cui ho parlato prima. Se state iniziando il vostro percorso di apprendimento di SQL, vi consiglio il percorso SQL from A to Z . Contiene 7 corsi di SQL che conducono dall'SQL di base a quello avanzato. È ottimo per sviluppare una solida base in questo linguaggio.

In ogni caso, come in ogni altro campo, l'apprendimento continuo è la chiave del successo. Quindi, tanti auguri e buon apprendimento!