SQL UNION vs UNION ALL: differenze, esempi e prestazioni testate

  1. Home
  2. Blog
  3. Database e SQL

Database e SQL

SQL UNION vs UNION ALL: Differenze, esempi e prestazioni testate

La differenza tra loro è una parola, ma scegliere sbagliato può darti silenziosamente il totale sbagliato. Guardali entrambi su dati reali, scopri le regole che condividono e leggi cosa è successo quando li abbiamo cronometrati su un milione di righe.

8 min di lettura
SQL UNION vs UNION ALL: differenze, esempi e prestazioni testate

Punti chiave

  • UNION combina i risultati e rimuove le righe duplicate. UNION ALL mantiene ogni riga.
  • I costi di deduplicazione funzionano, quindi UNION ALL è solitamente più veloce da calcolare.
  • Usare UNION prima di SUM può rimuovere silenziosamente i valori reali e dare la risposta sbagliata.
  • Il valore predefinito è UNION ALL, a meno che non si desideri specificamente rimuovere i duplicati.

Entrambi gli operatori impilano i risultati di due query uno sopra l’altro, quindi SQL UNION vs UNION ALL potrebbe sembrare una scelta minore. Non lo è. Una parola in più cambia sia il risultato che l’impegno con cui il database deve lavorare.

Abbiamo eseguito tutte le query qui in SQLite 3.50 e i risultati e i tempi mostrati provengono da tali esecuzioni. Il comportamento di base è SQL standard nei principali database. I tempi, tuttavia, differiranno a seconda del database, dei dati e dell’hardware, quindi considera il nostro come un esempio.

La risposta breve

UNION combina due set di risultati e restituisce solo righe distinte. UNION ALL li combina e restituisce tutto, inclusi i duplicati. Questa è l’intera differenza e il resto di questo articolo spiega perché è importante.

UNIONE vs UNIONE TUTTI fianco a fianco

Aspetto UNIONE UNIONE TUTTI
Righe duplicate Rimosso Mantenuto
Lavoro extra Deve trovare duplicati Nessuno
Velocità abituale Più lento Più veloce
Le righe sono tornate Uguale o meno Tutti quanti
Sicuro prima di SUM o COUNT? Spesso no Sì
Meglio per Elenchi unici Unione di dati, registri, totali

I dati del campione

Immagina un negozio che conserva gli ordini online e quelli in negozio in tabelle separate. Tieni presente che Asha ha due ordini online identici e un ordine identico in negozio.

CREATE TABLE online_orders (customer TEXT, total INT);
CREATE TABLE store_orders (customer TEXT, total INT);

INSERT INTO online_orders VALUES ('Asha',100), ('Ben',200), ('Asha',100);
INSERT INTO store_orders VALUES ('Asha',100), ('Dev',300);

Vedi la differenza

SELECT customer, total FROM online_orders
UNION
SELECT customer, total FROM store_orders;

-- Asha | 100
-- Ben  | 200
-- Dev  | 300
SELECT customer, total FROM online_orders
UNION ALL
SELECT customer, total FROM store_orders;

-- Asha | 100
-- Ben  | 200
-- Asha | 100
-- Asha | 100
-- Dev  | 300

Cinque righe di input sono diventate tre con UNION e tutte e cinque sono rimaste con UNION ALL. Due cose da notare:

  • UNION ha rimosso i duplicati dall’intero risultato, compresi quelli nella prima tabella. Non si tratta solo di confrontare tabelle.
  • Una riga viene considerata duplicata solo quando ogni colonna selezionata corrisponde.

Quando vuoi veramente un elenco distinto, UNION è esattamente giusto. Ciò offre a ogni cliente che ha acquistato tramite uno dei due canali:

SELECT customer FROM online_orders
UNION
SELECT customer FROM store_orders;

-- Asha
-- Ben
-- Dev

Il bug totale sbagliato

Questo è il motivo per cui la scelta conta davvero. Supponiamo di volere le entrate totali. Gli ordini sopra indicati ammontano a 800. Scopri cosa offre ciascun operatore:

SELECT SUM(total) FROM (
  SELECT total FROM online_orders
  UNION
  SELECT total FROM store_orders
);
-- 600

SELECT SUM(total) FROM (
  SELECT total FROM online_orders
  UNION ALL
  SELECT total FROM store_orders
);
-- 800

La versione UNION è sbagliata di 200. Poiché abbiamo selezionato solo la colonna total, tre ordini separati da 100 rupie sembravano duplicati e sono collassati in uno solo. Non c’è alcun messaggio di errore e 600 sembra un numero perfettamente credibile. Questo tipo di bug silenzioso può rimanere in un rapporto finanziario per mesi.

Suggerimento: Due righe dall’aspetto identico possono essere due eventi autentici. Prima di utilizzare UNION, chiedi se righe identiche significano lo stesso fatto registrato due volte o due fatti diversi. Per le vendite, i pagamenti e le voci di registro, solitamente è il secondo.

Regole che entrambi devono seguire

Entrambi gli operatori hanno gli stessi requisiti:

  1. Ciascuno SELECT deve restituire lo stesso numero di colonne.
  2. Le colonne corrispondono alla posizione, non al nome, quindi mantienile nello stesso ordine.
  3. I tipi di dati in ciascuna posizione devono essere compatibili.
  4. I nomi delle colonne dei risultati provengono da first SELECT.
  5. ORDER BY va proprio alla fine e si applica all’intero risultato.

Infrangere la prima regola genera un errore. Ecco il messaggio di SQLite:

SELECT customer, total FROM online_orders
UNION
SELECT customer FROM store_orders;

-- SELECTs to the left and right of UNION do not have
-- the same number of result columns

La seconda regola è più pericolosa perché può fallire senza errori. Se si scambiano due colonne dello stesso tipo, ad esempio first_name e last_name, la query viene eseguita e i dati risultano errati. SQLite è anche rilassato riguardo ai tipi, mentre database come PostgreSQL sono più rigidi e potrebbero richiedere un’impostazione esplicita CAST.

Etichetta la fonte

Un trucco molto pratico è aggiungere una colonna costante che mostri da dove proviene ciascuna riga. Poiché l’etichetta è diversa, le righe di tabelle diverse non possono più essere trattate come duplicati l’una dell’altra.

SELECT customer, total, 'online' AS channel FROM online_orders
UNION ALL
SELECT customer, total, 'store' FROM store_orders
ORDER BY customer, channel;

-- Asha | 100 | online
-- Asha | 100 | online
-- Asha | 100 | store
-- Ben  | 200 | online
-- Dev  | 300 | store

Una volta che i tuoi dati hanno un’etichetta, puoi raggrupparli per segnalare le vendite per canale, utilizzando GRUPPO PER. Se è necessario combinare più passaggi, racchiudere l’unione in un CTE per mantenerla leggibile.

Prestazioni: cosa è successo nel nostro test

Per rimuovere i duplicati, il database deve confrontare le righe, in genere ordinandole o effettuando l’hashing. UNION ALL può saltare questo passaggio. Abbiamo creato due tabelle con 500.000 righe ciascuna, contenenti numeri casuali da 0 a 50.000, quindi c’erano molti duplicati. Abbiamo eseguito ciascuna query più volte e abbiamo mantenuto il tempo migliore.

Innanzitutto, abbiamo contato i risultati, in modo che il tempo impiegato per inviare le righe al nostro programma non influisse sul confronto:

Query, racchiusa tra COUNT(*) Righe Il momento migliore
UNIONE 50,001 261 ms
UNIONE TUTTI 1,000,000 Meno di 1 ms

L’enorme divario è in parte dovuto al fatto che SQLite può calcolare quel conteggio senza leggere ogni riga, quindi per favore non leggerlo come “migliaia di volte più veloce”. Tuttavia, mostra l’idea centrale: UNION doveva fare un vero lavoro e UNION ALL no.

Quindi abbiamo recuperato tutte le righe in Python e il risultato è stato invertito:

Interrogazione, recupero di tutte le righe Le righe sono tornate Il momento migliore
UNIONE 50,001 277 ms
UNIONE TUTTI 1,000,000 392 ms

In questo caso, UNION ALL ha impiegato più tempo perché ha consegnato venti volte più righe. La deduplica non è ciò che l’ha rallentata. Gestire un milione di righe era. Quindi la regola onesta è che UNION ALL è più economico da calcolare per il database, ma anche la dimensione del risultato è importante. Molti grafici online riducono questo a “UNION ALL è sempre più veloce” e il nostro test mostra perché non è così semplice.

Non scegliere nemmeno in base alla velocità. Scegli l’operatore che dà per primo la risposta corretta, quindi sintonizzati. Se una query è lenta, leggi la nostra guida all’ottimizzazione delle query SQL.

Quando utilizzarli ciascuno

Utilizza UNION ALL quando:

  • Stai unendo dati da tabelle simili, ad esempio partizioni mensili.
  • Calcolerai i totali o i conteggi in seguito.
  • Sai che gli input non possono sovrapporsi.
  • I duplicati sono significativi, come nei registri o nei record di controllo.

Utilizzare UNION quando:

  • Hai bisogno di un elenco univoco, ad esempio ogni indirizzo email su due sistemi.
  • Le fonti sovrapposte contengono lo stesso fatto più di una volta.

Tratta UNION ALL come predefinito e usa UNION deliberatamente. Aggiungere una clausola WHERE a ciascun ramo, per filtrare in anticipo, aiuta entrambi.

INTERSEZIONE e ECCEZIONE

Due operatori di insiemi correlati rispondono a domande diverse. Entrambi seguono le stesse regole di colonna:

SELECT customer FROM online_orders
INTERSECT
SELECT customer FROM store_orders;
-- Asha  (bought in both channels)

SELECT customer FROM online_orders
EXCEPT
SELECT customer FROM store_orders;
-- Ben   (online only)

Oracle ha tradizionalmente utilizzato MINUS anziché EXCEPT e il supporto per questi operatori varia leggermente in base al database e alla versione.

UNIONE vs UNISCITI

Questi sono spesso confusi, ma combinano i dati in direzioni diverse:

Operazione Direzione Risultato
UNIONE Verticale Aggiunge più righe
ISCRIVITI Orizzontale Aggiunge più colonne

Errori comuni

  • Utilizzo UNION per abitudine. Potrebbe costarti velocità o rimuovere righe valide.
  • Selezione di un numero troppo limitato di colonne. Tralasciando un ID, le righe distinte sembreranno identiche.
  • Ordine delle colonne non corrispondente. I valori possono finire nella colonna sbagliata senza alcun errore.
  • Aggiunta ORDER BY a ciascun ramo. Ordina una volta, alla fine.
  • Utilizzo di UNION per correggere un join errato. Se compaiono duplicati a causa di un join, correggi il join.
  • Presupponendo l’ordine dei risultati. Senza ORDER BY, l’ordine delle righe non è garantito per nessuno degli operatori.

Considerazioni finali

Fai una domanda ogni volta: righe identiche sono lo stesso fatto o fatti separati? Se sono separati o se la sovrapposizione è impossibile, utilizzare UNION ALL. Se hai bisogno di un elenco univoco, usa UNION. Per controllare i tuoi rapporti, cerca il tuo codice per UNION vicino a SUM o COUNT e conferma che quei totali sono davvero corretti.

Domande frequenti

Qual è la differenza tra UNION e UNION ALL?

UNION combina due set di risultati e rimuove le righe duplicate. UNION ALL li combina e mantiene ogni riga, inclusi i duplicati.

Cos’è più veloce: UNION o UNION ALL?

UNION ALL è solitamente più economico da calcolare perché non controlla i duplicati. Restituire un risultato molto più ampio può comunque richiedere più tempo nel complesso, come ha dimostrato il nostro test.

UNION rimuove i duplicati all’interno di una tabella?

SÌ. Rimuove i duplicati nell’intero risultato combinato, incluse le righe identiche provenienti tutte dalla stessa tabella.

I nomi delle colonne devono corrispondere in una UNION?

No. Le colonne corrispondono in base alla posizione e il risultato utilizza i nomi della prima SELECT. Il conteggio delle colonne deve corrispondere e i tipi devono essere compatibili.

Posso utilizzare ORDER BY con UNION?

Sì, ma inserisci un ORDER BY alla fine dell’istruzione. Ordina l’intero risultato combinato anziché un singolo ramo.

Continua a imparare

Lavora con Stack Quora

Hai bisogno di aiuto con test, WordPress o SEO?

Aiutiamo i team a fornire software migliore e a far crescere i loro siti. Raccontaci a cosa stai lavorando e ti suggeriremo chiaramente il prossimo passo.

Continua a leggere

Altre guide su test, intelligenza artificiale e sviluppo moderno

Ti è piaciuto questo articolo? Scegli un argomento e passa direttamente ai nostri tutorial più recenti.

Intelligenza artificiale

Spiegazione delle allucinazioni dell'intelligenza artificiale: perché i modelli linguistici inventano le cose e come ridurle

Spiegazione delle allucinazioni dell'intelligenza artificiale: cosa sono, perché i modelli linguistici le producono, tipi comuni, come ridurle con b…

Leggi l'articolo →
DevOps

Spiegazione delle variabili d'ambiente: file .env, segreti e configurazione eseguiti correttamente

Variabili d'ambiente spiegate con esempi Python che abbiamo eseguito: lettura e impostazione, perché ogni valore è una stringa, file .env, ereditari…

Leggi l'articolo →
Sviluppo software

Spiegazione della limitazione della velocità API: algoritmi, intestazioni e gestione degli errori 429

La limitazione della velocità dell'API spiegata con una simulazione che abbiamo eseguito: bucket di token, finestra fissa, finestra scorrevole, risp…

Leggi l'articolo →
Automazione dei test

Derisione in Python: unittest.mock, patch e gli errori che fanno mentire i test

Mocking in Python con unittest.mock, testato: Mock e return_value, side_effect, patch dove viene utilizzato un nome, specifiche e autospec, date moc…

Leggi l'articolo →
Test del software

Spiegazione della copertura del codice: copertura di linea o di filiale e cosa significa realmente il 100%.

Copertura del codice spiegata con una vera esecuzione di cover.py: copertura di linea, ramo e condizione, lettura di un rapporto, perché la copertur…

Leggi l'articolo →
Database e SQL

DELETE vs TRUNCATE vs DROP in SQL: differenze, rollback e quando utilizzarli

DELETE vs TRUNCATE vs DROP spiegato con SQL testato: cosa rimuove, rollback, trigger, reimpostazione dell'identità, velocità e come differiscono Pos…

Leggi l'articolo →
Database e SQL

Spiegazione delle visualizzazioni SQL: crea, utilizza ed evita le insidie, con esempi

Viste SQL spiegate con le query che abbiamo eseguito: creazione di una vista, risultati in tempo reale, nascondere colonne, prestazioni, viste aggio…

Leggi l'articolo →
Sviluppo software

Interfaccia TypeScript e tipo: differenze reali, testate con il compilatore

Interfaccia TypeScript vs tipo, verificata con il vero compilatore: cosa possono fare entrambi, cosa può fare solo uno, fusione delle dichiarazioni,…

Leggi l'articolo →
Sviluppo software

Spiegazione di Python *args e **kwargs: funzioni flessibili con esempi chiari

Python *args e **kwargs spiegati con il codice che abbiamo eseguito: compressione e decompressione, ordine dei parametri, argomenti solo per parole …

Leggi l'articolo →
Sviluppo software

Funzioni Lambda Python: sintassi, usi reali e quando non usarli

Funzioni lambda Python spiegate con il codice che abbiamo eseguito: sintassi, ordinamento con chiave, mappa e filtro, chiusure, trap dell'associazio…

Leggi l'articolo →
Intelligenza artificiale

Cosa sono gli agenti AI? Come funzionano, con un semplice ciclo di agenti che puoi eseguire

Cosa sono gli agenti IA? Una semplice guida al ciclo dell'agente, agli strumenti, alla memoria e ai guardrail, con un piccolo ciclo Python che abbia…

Leggi l'articolo →
DevOps

Monitoraggio vs osservabilità: la vera differenza, con log, metriche e tracce

Spiegazione del monitoraggio e dell'osservabilità: errori noti e sconosciuti, log, metriche e tracce, una procedura dettagliata sugli incidenti di p…

Leggi l'articolo →
DevOps

Volumi Docker e montaggi di associazione: mantenere i dati del contenitore nel modo giusto

Volumi Docker e montaggi di collegamento spiegati: perché i dati del contenitore scompaiono, volumi denominati, montaggi di collegamento, tmpfs, ese…

Leggi l'articolo →
Automazione dei test

TDD vs BDD: differenze chiave, una caratteristica costruita in entrambi i modi e quando utilizzarli ciascuno

TDD vs BDD spiegato con una funzione di sconto costruita in entrambi i modi: refactoring rosso-verde con il codice che abbiamo eseguito, scenari "Da…

Leggi l'articolo →
Test del software

Test di accettazione da parte dell'utente (UAT): processo, lista di controllo ed esempi reali

Spiegazione del test di accettazione dell'utente: chi lo esegue, in cosa differisce dal QA, un processo in sette fasi, un modello di test case UAT, …

Leggi l'articolo →
Database e SQL

Spiegazione dei valori SQL NULL: IS NULL, COALESCE, NULLIF e le trappole da evitare

Valori SQL NULL spiegati con le query che abbiamo eseguito: logica a tre valori, IS NULL, COALESCE, NULLIF, come aggregazioni, join e ordinamento tr…

Leggi l'articolo →
Database e SQL

Istruzione SQL CASE WHEN: sintassi, esempi reali ed errori comuni

SQL CASE WHEN spiegato con le query che abbiamo eseguito: moduli semplici e cercati, ordine delle condizioni, pivot con SUM, trucchi COUNT, ordiname…

Leggi l'articolo →
Sviluppo software

Cos'è il JWT? Token Web JSON spiegati con un esempio funzionante

Cos'è il JWT? Spiegazione dei token Web JSON: le tre parti, un token creato e manomesso nel codice che abbiamo eseguito, JWT e sessioni, archiviazio…

Leggi l'articolo →
Sviluppo software

Spiegazione del loop di eventi JavaScript: stack di chiamate, microtask e timer con esempi

Il ciclo di eventi JavaScript spiegato con il codice che abbiamo eseguito: stack di chiamate, code di attività e microtask, perché setTimeout 0 non …

Leggi l'articolo →
Sviluppo software

Spiegazione dei generatori Python e del rendimento: risparmia memoria con esempi reali

Generatori Python e rendimento spiegati con il codice che abbiamo eseguito: come vengono messi in pausa e ripresi, misurato il risparmio di memoria,…

Leggi l'articolo →
Intelligenza artificiale

Cosa sono gli incorporamenti? I vettori e la somiglianza del coseno spiegati semplicemente

Cosa sono gli incorporamenti? Una guida in linguaggio semplice ai vettori, alla similarità del coseno e alla ricerca semantica, con un piccolo esemp…

Leggi l'articolo →
DevOps

Distribuzione blu-verde rispetto a quella canaria: differenze, compromessi e come scegliere

Spiegazione della distribuzione blu-verde e canary: come funziona ciascuna, costi, rischi e rollback, bucket utente stabile che abbiamo testato, mig…

Leggi l'articolo →
Automazione dei test

Test instabili: quali sono le cause e come risolverli definitivamente

Test instabili spiegati con demo che abbiamo eseguito: le cause principali, come confermarne e diagnosticarne uno, soluzioni adeguate per tempistich…

Leggi l'articolo →
Test del software

Test di carico e test di stress: differenze, metriche ed esempi k6

Spiegazione del test di carico e dello stress test: cosa dimostra ciascuno, test di picco e di assorbimento, le metriche che contano, perché le medi…

Leggi l'articolo →
Test del software

Caso di test e scenario di test: differenze chiave, esempi e quando utilizzarli

Spiegazione del caso di test e dello scenario di test: definizioni chiare, una tabella affiancata, una funzione di reimpostazione della password pre…

Leggi l'articolo →
Database e SQL

Ottimizzazione delle query SQL: leggi i piani di esecuzione e correggi query lente, con tempistiche

Ottimizzazione delle query SQL testata su un milione di righe: leggi i piani di esecuzione, aggiungi gli indici corretti, correggi filtri non aggior…

Leggi l'articolo →
Database e SQL

SQL UNION vs UNION ALL: differenze, esempi e prestazioni testate

SQL UNION vs UNION ALL spiegati con le query che abbiamo eseguito: duplicati, regole seguite da entrambi, un vero bug di dati, prestazioni misurate,…

Leggi l'articolo →
Sviluppo software

Tutorial sull'API di recupero JavaScript: GET, POST, gestione degli errori e timeout

Un tutorial sull'API JavaScript Fetch testato su un server locale: GET e POST, perché 404 non genera eccezioni, un helper riutilizzabile, stringhe d…

Leggi l'articolo →
Sviluppo software

Gestione dei file Python: lettura, scrittura, CSV, JSON e pathlib con esempi

Gestione dei file Python spiegata con il codice che abbiamo eseguito: modalità aperte, con, lettura di file di grandi dimensioni, CSV, JSON, pathlib…

Leggi l'articolo →
Sviluppo software

Classi e oggetti Python: tutorial OOP con esempi reali

Classi e oggetti Python spiegati con il codice che abbiamo eseguito: __init__, metodi, attributi di classe e istanza, ereditarietà, proprietà, metod…

Leggi l'articolo →
Intelligenza artificiale

Che cos'è un modello linguistico di grandi dimensioni? Come funzionano i LLM, spiegato senza esagerazioni

Cos’è un modello linguistico ampio? LLM spiegati in un linguaggio semplice: token, incorporamenti, attenzione, formazione, finestre di temperatura e…

Leggi l'articolo →
DevOps

Comandi Linux per principianti: la guida essenziale del terminale con esempi

Comandi Linux per principianti, raggruppati per attività: navigazione, file, visualizzazione log, grep, pipe, permessi, processi e archivi, con un e…

Leggi l'articolo →
Automazione dei test

Selenio vs drammaturgo: differenze chiave, codice a confronto e quale scegliere

Selenium vs Playwright a confronto: architettura, attesa, supporto per browser e linguaggio, debug, lo stesso test in entrambi gli strumenti, consig…

Leggi l'articolo →
Test del software

Partizionamento di equivalenza: tecnica di progettazione dei test spiegata con esempi pratici

Spiegazione del partizionamento di equivalenza: come trovare partizioni valide e non valide, esempi funzionanti per età, password e coupon, test che…

Leggi l'articolo →
Test del software

Gravità vs priorità nel test del software: differenze, matrice ed esempi reali

Spiegazione della gravità e della priorità nei test del software: definizioni chiare, una matrice a quattro vie con esempi, scale di livello, chi im…

Leggi l'articolo →
Database e SQL

Esercitazione sulle sottoquery SQL: tipi, sottoquery correlate ed EXISTS con esempi

Un tutorial sulle sottoquery SQL con le query che abbiamo eseguito: sottoquery scalari, IN, FROM e SELECT, sottoquery correlate, EXISTS, trap NOT IN…

Leggi l'articolo →
Database e SQL

Spiegazione di transazioni SQL e ACID: COMMIT, ROLLBACK e livelli di isolamento

Transazioni SQL e ACID spiegate con un bonifico bancario eseguito: COMMIT, ROLLBACK, punti di salvataggio, blocchi, livelli di isolamento, letture s…

Leggi l'articolo →
Sviluppo software

Git merge vs rebase: differenze, esempi e quando usare ciascuno

Git merge vs rebase spiegato con output reale del log, una tabella di confronto, la regola d'oro del rebase e un flusso di lavoro sicuro per i team.

Leggi l'articolo →
Sviluppo software

List comprehension in Python: sintassi, esempi e quando evitarla

List comprehension in Python spiegata: sintassi, filtri, if-else, cicli annidati, tempi misurati e i casi in cui un normale ciclo for è meglio.

Leggi l'articolo →
Database e SQL

SQL JOIN spiegati con esempi (Inner, Left, Right, Full)

Capisci i JOIN SQL passo dopo passo con tabelle e query di esempio: INNER, LEFT, RIGHT, FULL, CROSS e SELF, con errori comuni e consigli sulle prest…

Leggi l'articolo →