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

Come usare LEFT JOIN con più tabelle in SQL

È possibile unire con LEFT JOIN tre tabelle in SQL? Sì, certo! È possibile utilizzare più LEFT JOIN in un'unica query, se necessario per l'analisi. In questo articolo illustrerò alcuni esempi per dimostrare come si possono unire più tabelle in SQL e come evitare alcune insidie comuni.

Il modo migliore per esercitarsi sui diversi tipi di join è il nostro corso interattivo SQL JOINs. Contiene oltre 90 esercizi pratici che coprono semplici join a due tabelle, join a più tabelle, LEFT JOIN, FULL JOIN e molti altri. È la rassegna pratica più completa di SQL JOINs disponibile su Internet.

Che cos'è una LEFT JOIN?

Iniziamo ricordando cos'è una LEFT JOIN e come si usa. Se ricordate una INNER JOIN restituisce solo i record presenti in entrambe le tabelle. Al contrario, una LEFT JOIN in SQL restituisce tutti i record (o righe) della tabella di sinistra e solo i record (o righe) corrispondenti della tabella di destra. Ciò implica che, se una riga specifica è presente nella tabella di sinistra ma non in quella di destra, il risultato includerà questa riga ma con un valore NULL in ogni colonna della tabella di destra. Se un record della tabella di destra non è presente nella tabella di sinistra, non sarà incluso nel risultato.

Giunzione

La sintassi generale di una LEFT JOIN è la seguente:

SELECT nomi colonna
FROM tabella1
LEFT JOIN tabella2
  ON tabella1.colonna_comune = tabella2.colonna_comune;

Per ulteriori informazioni sui join SQL, consultare questa guida completa.

La LEFT JOIN è spesso utilizzata per compiti analitici. In primo luogo, è molto utile per identificare i record di una determinata tabella che non hanno alcuna corrispondenza con i di un'altra. In questo caso, è possibile aggiungere una clausola WHERE alla query per selezionare, dal risultato della join, le righe con valori NULL in tutte le colonne della seconda tabella. Tuttavia, è necessario assicurarsi che la seconda tabella non contenga record con valori NULL in tutte le colonne, tranne che nel campo comune utilizzato per l'unione. In alternativa, utilizzate una colonna della seconda tabella completamente popolata senza valori NULL, se presente.

Ecco un altro scenario. Immaginiamo di gestire una libreria online e di voler confrontare i clienti che hanno effettuato ordini negli ultimi 6 mesi con quelli che sono stati inattivi nello stesso periodo. In questo caso, vogliamo che il risultato includa TUTTI i clienti, sia attivi che inattivi, unendo i dati sui clienti con quelli sulle vendite recenti. Questo è un uso perfetto per un LEFT JOIN.

Ecco le tabelle clienti e vendite della nostra libreria.

Clienti

idnomecognomegenereetàcliente_dal
1DanielBlackM342014-10-13
2ErikBrownM252015-06-10
3DianaTrumpF392015-10-25
4AnnaYaoF192017-02-20
5ChristianSandersM422018-01-31

Vendite

iddataid_libroid_clientequantitàspesa
12019-09-0223114.99
22019-10-0112112.99
32019-10-0134115.75

Per unire queste due tabelle e ottenere le informazioni necessarie per l'analisi, utilizzate la seguente query SQL:

SELECT c.id, c.nome, c.cognome, c.generr, c.età, c.cliente_dal,    
       s.data AS data_vendita, sum(s.spesa) AS totale_speso
FROM clienti c
LEFT JOIN vendite s
ON c.id = s.id_cliente
GROUP BY c.id;

In questo modo, conserviamo tutti i record dei clienti, aggiungiamo la data di vendita e calcoliamo l'importo totale speso. Nella tabella sottostante, le righe presenti nella INNER JOIN sono evidenziate in blu, mentre il giallo indica i record aggiuntivi dovuti alla LEFT JOIN.

idnomecognomegenereetàcliente_daldata_venditatotale_speso
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-0112.99
3DianaTrumpF392015-10-252019-09-0214.99
4AnnaYaoF192017-02-202019-10-0115.75
5ChristianSandersM422018-01-31[NULL][NULL]

Come si può notare, i clienti che non hanno effettuato acquisti nel periodo considerato hanno un valore NULL per la data di vendita e l'importo totale speso, poiché i loro record non sono presenti nella tabella vendite. Ecco come funziona una LEFT JOIN. Per esercitarsi con le LEFT JOIN e altri tipi di join, consultate il nostro corso completo SQL JOINs oppure consultate il nostro percorso SQL Practice con diversi esercizi SQL per esercitarvi su vari costrutti SQL.

Passiamo ora a casi più complicati!

Usare multiple LEFT JOIN in una query

A volte è necessario eseguire una LEFT JOIN tra più di due tabelle per ottenere i dati necessari per analisi specifiche. Fortunatamente, la parola chiave LEFT JOIN può essere utilizzata con più tabelle in SQL.

Vediamo un esempio. Vogliamo analizzare l'impatto della nostra recente campagna promozionale sul comportamento dei nostri clienti.

Promozioni

idcampagnaid_clientedata
1SMS_discount1022019-09-01
2SMS_discount1032019-09-01
3SMS_discount1052019-09-01

Per fare questo, dobbiamo combinare i dati relativi alle tabelle: clienti, vendite e promozioni.

SELECT c.id, c.nome, c.cognome, c.genere, c.età, c.cliente_dal, 
   s.data AS vendita, p.data AS promozione
FROM clienti c
LEFT JOIN vendite s
ON c.id = s.id_cliente
LEFT JOIN promozioni p
ON c.id = p.id_cliente;

Ecco il risultato della join:

idnomecognomegenereetàcliente_dalvenditapromozione
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-012019-09-01
3DianaTrumpF392015-10-252019-09-022019-09-01
4AnnaYaoF192017-02-202019-10-01[NULL]
5ChristianSandersM422018-01-31[NULL]2019-09-01

Come si può notare, utilizzando un LEFT JOIN, abbiamo mantenuto i record di tutti i nostri clienti, indipendentemente dalla cronologia degli acquisti o dalla partecipazione alle campagne promozionali. Ad esempio, il cliente 1 è presente nel risultato della join anche se non ha effettuato alcun acquisto né ha ricevuto il messaggio promozionale. Abbiamo anche il cliente 4 che ha acquistato un libro ma non ha ricevuto alcun messaggio promozionale, così come il cliente 5 che ha ricevuto un messaggio promozionale ma non ha effettuato alcun acquisto. Infine, anche i clienti che hanno effettuato acquisti e ricevuto messaggi promozionali (clienti 2 e 3) sono inclusi nel risultato.

Si noti che in questo esempio abbiamo utilizzato un campo comune della prima tabella per unire la seconda e la terza tabella. Tuttavia, questo non è sempre il caso. Esaminiamo un caso in cui un campo comune della seconda tabella viene usato per unire con una LEFT JOIN la terza tabella, ma non la prima.

Vogliamo scoprire quali sono i generi di libri che interessano di più ai nostri clienti. Queste informazioni sono molto preziose, in quanto ci aiutano a fornire un'esperienza più personalizzata ai nostri clienti con consigli specifici sui libri. Per questa analisi, abbiamo bisogno dei dati di: clienti, vendite e libri. Abbiamo già unito i primi due nel nostro primo esempio; a questo aggiungeremo la tabella libri.

Libri

idtitoloautoregenerequantitàprezzo
1The Lord of the RingsJ. R. R. Tolkienfantasy712.99
2LolitaVladimir Nabokovnovel414.99
4The HobbitJ. R. R. Tolkienfantasy1010.75
5Death on the NileAgatha Christiedetective89.75

Per ottenere i dati necessari ad analizzare i libri e i generi preferiti dai nostri clienti, utilizzate la seguente query:

SELECT c.id, c.nome, c.cognome, s.data AS vendita, 
 b.titolo AS libro, b.genere
FROM clienti c
LEFT JOIN vendite s
ON c.id = s.id_cliente
LEFT JOIN libri b
ON s.id_libro = b.id;

Ecco il risultato del join, in cui i dati dei clienti vengono combinati con quelli dei libri acquistati di recente (se presenti).

idnomecognomevenditalibrogenere
1DanielBlack[NULL][NULL][NULL]
2ErikBrown2019-10-01The Lord of the Ringsfantasy
3DianaTrump2019-09-02Lolitanovel
4AnnaYao2019-10-01[NULL][NULL]
5ChristianSanders[NULL][NULL][NULL]

Abbiamo due clienti (1 e 5) che non hanno acquistato nulla e quindi non hanno record corrispondenti nella tabella vendite. Tuttavia, queste righe vengono mantenute utilizzando una LEFT JOIN. Inoltre, la tabella include la riga corrispondente al cliente 4 che ha recentemente acquistato un libro non presente nel nostro database e quindi non ha dati nella tabella libri. Il risultato del join include comunque questo record, grazie alla LEFT JOIN.

Come si può notare, la LEFT JOIN in SQL può essere utilizzata con più tabelle. Tuttavia, per essere sicuri di ottenere i risultati desiderati, è bene tenere presente i problemi che possono sorgere quando si uniscono più di due tabelle.

Cose da considerare con multiple LEFT JOIN

L'unione di più tabelle in SQL può essere complicata. Ecco alcune considerazioni da fare quando si utilizzano le LEFT JOIN, in particolare con più tabelle.

A differenza della INNER JOIN, l'ordine delle tabelle gioca un ruolo importante nella LEFT JOIN e i risultati possono essere completamente diversi se l'ordine cambia nella query SQL. Quando si determina l'ordine delle tabelle in una LEFT JOIN, la regola generale è quella di iniziare con la tabella di cui si desidera mantenere tutti i record nel risultato finale.

Inoltre, si tenga presente che una LEFT JOIN si ripercuote con effetto domino su tutte le join di una query. Se si utilizza una LEFT JOIN, spesso anche le tabelle successive devono essere unite con una LFET JOIN. Una INNER JOIN eliminerà i record che non si trovano su entrambi i lati dell'unione e si potrebbero perdere tutti i record che si vogliono conservare, motivo per cui si usa una LEFT JOIN invece della solita INNER JOIN.

Inoltre, una LEFT JOIN dovrebbe essere usata per la terza tabella quando la prima tabella ha record che non si trovano nella seconda (cosa comune per le LEFT JOIN!) e viene usato un campo comune diverso per unire la seconda e la terza tabella. Se si utilizza una INNER JOIN in questa situazione, si eliminano tutti i record della prima tabella non trovati nella seconda e nella terza.

Questo è il caso dell'esempio precedente, in cui abbiamo unito le tabelle: clienti, vendite e libri. Vediamo cosa succede se usiamo una INNER JOIN invece di una LEFT JOIN per aggiungere i dati dalla tabella libri:

SELECT c.id, c.nome, c.cognome, s.data AS vendita, 
 b.titolo AS libro, b.genere
FROM clienti c
LEFT JOIN vendite s
ON c.id = s.id_cliente
INNER JOIN libri b
ON s.id_libro = b.id;
idnomecognomevenditalibrogenere
2ErikBrown2019-10-01The Lord of the Ringsfantasy
3DianaTrump2019-09-02Lolitanovel

Come si può vedere, ora otteniamo solo due record invece di cinque. Quando eseguiamo l'unione utilizzando una INNER JOIN, perdiamo un record corrispondente all'acquisto del libro non presente nella tabella libri. Abbiamo anche perso le informazioni sui due clienti che non hanno effettuato acquisti recenti, ovvero i record che dovevamo conservare unendo la tabella vendite con una LEFT JOIN. Questo perché abbiamo unito la terza tabella utilizzando un campo comune con la seconda e questa colonna è NULL per tutte le righe della prima tabella che non si trovano nella seconda. Di conseguenza, questi record non vengono abbinati alla terza tabella e vengono quindi eliminati dalla INNER JOIN nell'ultima parte della query.

È ora di fare pratica con le multiple LEFT JOIN!

Avete imparato molto sulle LEFT JOIN! Ora conoscete anche le sfumature della unione con una LEFT JOIN di più tabelle in un'unica query SQL. Mettiamo in pratica le competenze appena acquisite:

  • Il nostro corso SQL JOINs fornisce materiale pratico completo per diversi tipi di join, tra cui LEFT JOIN, INNER JOIN, self join, non-equi join e, naturalmente, join di più tabelle in un'unica query.
  • Il nostro percorso SQL Practice offre numerosi corsi interattivi e pratici di SQL per esercitarsi in diversi costrutti SQL come: JOIN, GROUP BY, aggregazione e altro ancora.

Grazie per aver letto e buon apprendimento!