Corso
Nel mondo SQL, la possibilità di combinare dati da più query è un requisito fondamentale, e SQL offre funzioni potenti come UNION e UNION ALL per farlo.
Come vedrai, capire le sottili differenze tra le funzioni UNION e UNION ALL in SQL è essenziale per interrogare e gestire i dati in modo efficiente. Questo tutorial spiega le principali somiglianze, differenze e casi d’uso utilizzando dataset di esempio per aiutarti a ottimizzare le tue query SQL.
La risposta breve: SQL UNION vs UNION ALL
La differenza chiave è che UNION rimuove i record duplicati, mentre UNION ALL include tutti i duplicati. Questa distinzione non solo cambia il numero di righe nel risultato della query, ma influisce anche sulle prestazioni.
| Caratteristica | UNION | UNION ALL |
|---|---|---|
| Duplicati | Rimuove i record duplicati | Mantiene tutti i record (inclusi i duplicati) |
| Prestazioni | Più lento (deve ordinare/effettuare hash dei dati per trovare i duplicati) | Più veloce (si limita ad aggiungere i dati al risultato) |
| Operazione | Teoria degli insiemi (unione matematica) | Accodamento/stacking dei risultati |
Consideriamo due tabelle di esempio, employees_2023 e employees_2024, che rappresentano i record dei dipendenti per due anni diversi.
SELECT *
FROM employees_2023
|
employee_id |
name |
department |
|
1 |
Alice |
HR |
|
2 |
Bob |
IT |
|
3 |
Charlie |
Finance |
SELECT *
FROM employees_2024
|
employee_id |
name |
department |
|
2 |
Bob |
IT |
|
3 |
Charlie |
Finance |
|
4 |
David |
Marketing |
Ora uniamo le due tabelle usando la funzione UNION.
SELECT employee_id, name, department FROM employees_2023
UNION
SELECT employee_id, name, department FROM employees_2024;
|
employee_id |
name |
department |
|
1 |
Alice |
HR |
|
2 |
Bob |
IT |
|
3 |
Charlie |
Finance |
|
4 |
David |
Marketing |
In questo risultato, i record duplicati vengono rimossi. Ora confrontiamolo con il risultato che otteniamo usando UNION ALL.
SELECT employee_id, name, department FROM employees_2023
UNION ALL
SELECT employee_id, name, department FROM employees_2024;
|
employee_id |
name |
department |
|
1 |
Alive |
HR |
|
2 |
Bob |
IT |
|
3 |
Charlie |
Finance |
|
2 |
Bob |
IT |
|
3 |
Charlie |
Finance |
|
4 |
David |
Marketing |
In questo risultato, sono inclusi tutti i record e i duplicati non vengono rimossi.
Che cos’è UNION in SQL?
La funzione UNION combina i risultati di due o più query SELECT in un unico set di risultati, rimuovendo le righe duplicate. Ogni istruzione SELECT all’interno di UNION deve avere lo stesso numero di colonne. Inoltre, devono avere tipi di dati simili e le colonne devono essere nello stesso ordine. Per capire la funzione, creiamo due tabelle di esempio qui sotto.
CREATE TABLE sales_team (
employee_id INT,
employee_name VARCHAR(50)
);
INSERT INTO sales_team (employee_id, employee_name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');
CREATE TABLE support_team (
employee_id INT,
employee_name VARCHAR(50)
);
INSERT INTO support_team (employee_id, employee_name) VALUES
(3, 'Charlie'),
(4, 'David'),
(5, 'Eve');
Il codice sopra creerà le due tabelle che useremo in questo tutorial, rispettivamente sales_team e support_team. Puoi visualizzare le tabelle usando il codice seguente.
SELECT *
FROM sales_team

Record nella tabella sales_team. Immagine dell’autore
SELECT *
FROM support_team

Record nella tabella support_team. Immagine dell’autore
Sono tabelle piccole con tre record ciascuna, e i nomi delle colonne sono autoesplicativi. Ora che abbiamo creato le due tabelle, applichiamo la funzione UNION.
SELECT employee_id, employee_name
FROM sales_team
UNION
SELECT employee_id, employee_name
FROM support_team;

Output della funzione UNION. Immagine dell’autore
Si vede che la voce duplicata di employee_id, con valore 3, viene rimossa.
Quali sono i casi d’uso di UNION in SQL?
Ecco alcuni casi d’uso comuni della funzione UNION.
-
Combinare risultati da tabelle diverse: Quando vuoi unire dati da più tabelle assicurandoti di non avere record duplicati,
UNIONè la funzione di riferimento. -
Gestire fonti dati diverse:
UNIONè utile quando combini tabelle provenienti da fonti differenti. -
Rimuovere duplicati tra query: Quando vuoi garantire l’unicità del set di risultati combinato, usa
UNION.
Che cos’è UNION ALL in SQL?
La funzione UNION ALL combina i risultati di due o più query SELECT, includendo tutte le righe duplicate. Questa funzione è più veloce di UNION perché non si preoccupa di rimuovere i duplicati.
SELECT employee_id, employee_name
FROM sales_team
UNION ALL
SELECT employee_id, employee_name
FROM support_team;

Output della funzione UNION ALL. Immagine dell’autore
In questo caso, le voci duplicate vengono ripetute e non rimosse.
Quali sono i casi d’uso di UNION ALL in SQL?
Ecco alcuni casi d’uso comuni della funzione UNION ALL.
- Combinare risultati con duplicati: Usa
UNION ALLquando devi unire risultati da più query e mantenere tutte le righe duplicate. - Considerazioni sulle prestazioni:
UNION ALLè più efficiente in termini di tempo rispetto aUNION, perché non richiede il passaggio aggiuntivo di rimozione dei duplicati. - Aggregare dati di periodi diversi: Quando aggreghi dati di periodi o fonti differenti e devi preservare le voci duplicate, è preferibile
UNION ALL. - Reportistica e analisi: Per report in cui è necessario ogni record, inclusi i duplicati,
UNION ALLè adatto.
UNION e UNION ALL: somiglianze e differenze
Creiamo una tabella di riepilogo delle somiglianze e differenze.
|
Caratteristica |
UNION |
UNION ALL |
|
Righe duplicate |
Rimosse |
Incluse |
|
Prestazioni |
Più lento |
Più veloce |
|
Caso d’uso |
Quando ti servono record univoci |
Quando ti servono tutti i record |
|
Dimensione del risultato |
Più piccola |
Più grande |
Differenze di sintassi tra UNION e UNION ALL nei diversi dialetti SQL
Sebbene la sintassi di base rimanga la stessa nei vari dialetti SQL, ci sono leggere variazioni a seconda della piattaforma. Osservando il codice, nella maggior parte delle piattaforme, come SQL Server, Oracle, MySQL, PostgreSQL o BigQuery, il codice sarà simile a quanto mostrato di seguito.
SELECT employee_id, employee_name
FROM sales_team
UNION ALL
SELECT employee_id, employee_name
FROM support_team;
I comandi di base in questi dialetti SQL restano gli stessi, con alcune sfumature e differenze:
- Gestione di NULL e collations: I diversi dialetti SQL possono avere regole differenti per la gestione dei valori
NULLe della collation delle stringhe. - Ottimizzazioni delle prestazioni: Le ottimizzazioni e l’efficienza di esecuzione possono variare.
- Gestione degli errori e avvisi: I diversi dialetti possono gestire errori e avvisi in modo diverso quando si usano queste funzioni.
- Funzioni e caratteristiche specifiche della piattaforma: Alcuni dialetti SQL possono offrire funzioni o caratteristiche aggiuntive da usare insieme a
UNIONeUNION ALLper scenari più complessi.
Il comando è significativamente diverso nel caso di PySpark, che opera in un ambiente distribuito. Il codice è riportato di seguito, assumendo che df1 e df2 siano i nomi dei due DataFrame contenenti le due tabelle create sopra:
df1.union(df2)
3 regole ed errori comuni quando si usa SQL UNION
Sebbene UNION e UNION ALL siano potenti, sono rigide in termini di sintassi. Se la tua query restituisce un errore, probabilmente sta violando una di queste tre regole d’oro.
1. Conteggio delle colonne non corrispondente
L’errore più comune è una mancata corrispondenza nel numero di colonne. Per combinare due dataset, la “forma” delle tabelle deve essere identica. Non puoi impilare una tabella con 3 colonne sopra una tabella con 2 colonne.
L’errore:
-- This will fail because the column counts do not match
SELECT employee_id, name, department
FROM employees_2023
UNION
SELECT employee_id, name
FROM employees_2024;
La soluzione: Assicurati che entrambe le istruzioni SELECT richiedano esattamente lo stesso numero di colonne. Se nella seconda tabella manca un dato (come department), puoi selezionare NULL come segnaposto per far combaciare i conteggi:
SELECT employee_id, name, department FROM employees_2023
UNION
SELECT employee_id, name, NULL as department FROM employees_2024;
2. Compatibilità dei tipi di dato
SQL combina i risultati in base alla posizione, non al nome della colonna. Il tipo di dato della prima colonna nella prima query deve corrispondere (o essere compatibile) con il tipo di dato della prima colonna nella seconda query.
L’errore: Se inverti accidentalmente l’ordine delle colonne, SQL prova a impilare un numero (ID) sopra una stringa (Nome), causando un errore di conversione del tipo di dato.
-- This fails because Column 1 (ID - INT) cannot combine with Column 1 (Name - VARCHAR)
SELECT employee_id, name FROM employees_2023
UNION
SELECT name, employee_id FROM employees_2024;
La soluzione: Verifica sempre che le colonne siano elencate nello stesso identico ordine in ogni istruzione SELECT all’interno della UNION.
3. Limitazioni di ORDER BY
Un punto di confusione frequente è dove posizionare la clausola ORDER BY. Non puoi ordinare le singole sottoquery all’interno di un’operazione di UNION; puoi ordinare solo il risultato finale combinato.
L’errore: Usare ORDER BY prima della query finale genererà un errore di sintassi.
-- INCORRECT SYNTAX
SELECT employee_id, name FROM employees_2023
ORDER BY employee_id -- You cannot sort here!
UNION
SELECT employee_id, name FROM employees_2024;
La soluzione: Inserisci la clausola ORDER BY alla fine della query. In questo modo l’ordinamento si applica all’intero set di risultati combinato.
-- CORRECT SYNTAX
SELECT employee_id, name FROM employees_2023
UNION
SELECT employee_id, name FROM employees_2024
ORDER BY employee_id; -- Sorts the final result
Considerazioni finali
È fondamentale comprendere quando applicare UNION rispetto a UNION ALL per gestire i dati in modo efficiente con SQL. Mentre UNION seleziona solo i record distinti, UNION ALL li seleziona tutti, influenzando prestazioni e dimensione del set di risultati. Usa queste conoscenze per scegliere la funzione più adatta alle tue esigenze specifiche.
Per approfondire, valuta le seguenti risorse:
- Introduzione a SQL: Impara a creare e interrogare database relazionali usando SQL.
- Fondamenti di SQL: Acquisisci le competenze SQL di base per interagire con i tuoi dati e interrogarli.
- Certificazione SQL Associate: Dimostra le tue capacità SQL estraendo i dati appropriati da un database e usandoli per rispondere a domande comuni sui dati.
- SQL intermedio: Con questo corso pratico imparerai tutto ciò che ti serve per analizzare i dati usando il tuo codice SQL, già da oggi.
Professionista esperto in data science, intelligenza artificiale, analytics e strategia dei dati.
Domande frequenti
Qual è la differenza principale tra SQL UNION e UNION ALL?
UNION rimuove i record duplicati, mentre UNION ALL include tutti i duplicati.
C’è una differenza di prestazioni tra UNION e UNION ALL?
Sì, in genere UNION è più lento perché rimuove i duplicati.
Ci sono casi d’uso specifici in cui UNION ALL è preferibile a UNION?
UNION ALL è preferibile quando ti servono tutti i record, inclusi i duplicati, ad esempio per reportistica e analisi.
Quando dovrei usare SQL UNION invece di UNION ALL?
Usa UNION quando ti serve un set di risultati combinato senza duplicati.
In che modo i diversi dialetti SQL influiscono sull’uso di UNION e UNION ALL?
Anche se la sintassi di base è coerente, potrebbero esserci leggere variazioni nelle prestazioni, nella gestione dei NULL e nella collation tra i diversi dialetti SQL.


