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

UNION e UNION ALL in SQL: Cosa fanno e come sono diverse

In questo articolo esploreremo le clausole SQL UNION e UNION ALL. Scoprite cosa fanno e quando usarle.

Sono stato analista per circa quattro anni prima di conoscere la clausola SQL UNION ALL. Usavo regolarmente UNION, ma non avevo mai sentito parlare della sua controparte. Poi un giorno ho sentito un collega che ne parlava. Mi sono detto: "Di cosa sta parlando? È qualcosa di nuovo?" Così ho fatto quello che ogni buon analista avrebbe fatto e l'ho cercato su Google. Mi si è stretto il cuore. Probabilmente, in più di un'occasione, avevo usato la clausola sbagliata nelle mie analisi.

Dopo l'università, ho imparato da solo l'SQL. Il risultato fu una comprensione incompleta della sintassi che stavo utilizzando. Se state imparando, vi consiglio di seguire dei corsi formali, in modo da essere sicuri di avere una comprensione completa delle query che state scrivendo. Un ottimo modo per farlo è quello di frequentare il SQL Basics corso. Non commettete gli stessi errori che ho commesso io all'inizio della mia carriera. Seguite i corsi dei professionisti e acquisite una solida conoscenza di base di SQL.

Sto correndo un po' troppo. Facciamo un passo indietro e parliamo di cosa fanno UNION e UNION ALL in SQL.

UNIONE

A volte capita che un analista abbia bisogno di combinare i risultati di più query. Ciò può essere dovuto al fatto che i dati si trovano in tabelle diverse o forse si dispone di query esistenti che devono essere trasformate in un'unica query. Qualunque sia la ragione, la soluzione più semplice è usare UNION. Illustriamo un esempio.

Esempio n. 1 - UNION

In questo esempio, immaginiamo di lavorare all'analisi dei dati di un sito web. La tabella con cui lavoreremo si chiama button_clicks. Questa tabella contiene tutti gli eventi di clic che stiamo tracciando sul nostro sito web. L'aspetto è questo:

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue

Lavoreremo anche con una tabella chiamata : navigation_clicks. Questa tabella contiene tutti gli eventi di clic che si verificano nel menu di navigazione del sito web. L'aspetto è questo:

user_idtimestampnavigation_link
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Supponiamo che il nostro manager venga da noi e ci dica che ha bisogno di un elenco di tutti i clic sui pulsanti del sito web. È abbastanza facile. Noi ci limitiamo a eseguire l'operazione:

SELECT *
FROM button_clicks

Tuttavia, qualche minuto dopo il manager torna da noi e ci chiede di includere i clic di navigazione nel nostro report. Sembra abbastanza semplice, ma come si fa? Utilizzando la clausola UNION. Per combinare insieme i risultati di queste due query, eseguiamo:

SELECT *
FROM button_clicks
	
	UNION

SELECT *
FROM navigation_clicks

Come si può notare, la clausola UNION si inserisce tra le due query SELECT. La query su entrambi i lati della clausola UNION deve essere eseguita come query indipendente. Questa query restituirà quanto segue:

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Abbiamo preso i risultati di due query separate e li abbiamo messi uno sopra l'altro. Vediamo che le prime 4 righe contengono i risultati della prima query e le successive 5 righe contengono i risultati della seconda query.

Ma aspettate... le nostre tabelle combinate contengono 10 righe, quindi perché ne sono state restituite solo 9? Questo perché UNION rimuove i duplicati dai risultati. Le prime due righe della tabella button_clicks sono identiche, quindi UNION ne ha restituito solo una.

Rinominare le colonne in UNION

Nel set di risultati di cui sopra, notate i nomi delle colonne. Nella tabella button_clicks, la terza colonna è label, ma nella tabella navigation_clicks la terza colonna è navigation_label. Quando si utilizza UNION, i nomi delle colonne derivano dai nomi delle colonne della prima query, che è ciò che si vede sopra. Se si desidera, è sempre possibile aggiungere degli alias alle colonne per rinominarle a proprio piacimento.

Ad esempio, se si vuole cambiare il nome della terza colonna in button_or_navigation_label, si deve eseguire:

SELECT user_id, 
	 timestamp,
       label AS button_or_navigation_label
FROM button_clicks
	
	UNION

SELECT user_id, 
	 timestamp,
       navigation_label AS button_or_navigation_label
FROM navigation_clicks

Esempio n. 2 - Utilizzo dello stesso numero di colonne in UNION

Vediamo un altro esempio di utilizzo di UNION. Per prima cosa, apporteremo una piccola modifica alla nostra tabella navigation_clicks tabella. Aggiungeremo una colonna in più, in modo che la nostra tabella abbia ora questo aspetto:

user_idtimestampnavigation_linknavigation_level
1364782022-12-01 09:10:15homemain
1364782022-12-01 09:12:12about_ussub
1827362022-12-01 09:17:59storesub
2736472022-12-01 09:21:30homemain
3475892022-12-01 09:18:17blogsub

Se proviamo a eseguire di nuovo la nostra query originale UNION, otterremo un errore che recita Each UNION query must have the same number of columns. Questo perché stiamo selezionando tutte le colonne di ogni tabella, ma il numero di colonne nelle tabelle è ora diverso. Per risolvere questo problema, è necessario nominare esplicitamente le colonne che si desidera restituire. Inoltre, il numero di colonne restituite da ciascuna query deve essere lo stesso e il tipo deve corrispondere. Se la terza colonna della prima query è una stringa, anche la terza colonna dell'altra query deve essere una stringa.

Per evitare errori, eseguiamo:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

Questo restituirà gli stessi risultati del primo esempio UNION.

Esempio n. 3 - UNION ALL

Ora che abbiamo compreso UNION, facciamo un esempio utilizzando UNION ALL. Come già detto, UNION rimuove i duplicati dai risultati della query. UNION ALL non lo farà.

Continuiamo a basarci sull'esempio precedente. Il nostro manager ci ha chiesto un report che contenesse tutti i clic sui pulsanti e sulla navigazione del sito web. Abbiamo poi confermato che il report deve includere i duplicati.

Dal momento che sapete già come utilizzare UNION, riuscite a immaginare come fare? Esatto, basta sostituire UNION con UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks
user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Ci sono tutte e 10 le righe. Come si può vedere, UNION ALL ha conservato tutti i risultati, anche se ci sono dei duplicati.

I nostri esempi hanno incluso solo una dichiarazione UNION o UNION ALL, ma non c'è limite al numero di query che si possono unire.

Per fare un ultimo esempio, supponiamo di voler includere anche una tabella chiamata form_clicks. Non ci preoccupiamo dei duplicati, quindi continueremo a usare UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

UNION ALL

SELECT user_id, 
 timestamp,
 	 form_label
FROM form_clicks

Come si può vedere, la sintassi è esattamente la stessa; stiamo solo continuando ad aggiungere qualcosa alla nostra query esistente. Se siete interessati a saperne di più su UNION ALL, leggete il nostro articolo SQL Union All!

UNION vs. UNION ALL - Scegliere quale utilizzare

È importante capire che una query che utilizza UNION ALL sarà più veloce di una che utilizza UNION. Ciò è dovuto al fatto che la clausola UNION seleziona i dati e rimuove i duplicati. A seconda della quantità di dati da interrogare, questo potrebbe aggiungere una discreta quantità di tempo alla query.

Per decidere quale clausola utilizzare, è sufficiente porsi la seguente domanda:

  1. Ho bisogno di rimuovere i valori duplicati?
    1. Se sì, usare UNION.
    2. Se no (o se non è importante), usare UNION ALL.

Questo è molto, quindi prendiamoci un po' di tempo per ripassare! Sia UNION che UNION ALL sono clausole utilizzate per combinare più query in un unico insieme di risultati. UNION rimuove i duplicati, mentre UNION ALL non lo fa. UNION ALL viene eseguito più velocemente per questo motivo. Ecco un altro ottimo articolo sulle operazioni SQL Set che vi aiuterà a rafforzare ed espandere ciò che avete appena imparato.

Ottimo lavoro! Ora avete una conoscenza approfondita di UNION e UNION ALL e potete decidere con cognizione di causa quale utilizzare nelle vostre analisi. Siete già parecchi passi avanti rispetto a dove mi trovavo io quando stavo imparando! Non dimenticate di dare un'occhiata al nostro SQL Basics e continuate il vostro viaggio per diventare scrittori esperti di SQL.