Qual è la differenza tra UNION e UNION ALL?


Risposte:


1734

UNIONrimuove i record duplicati (dove tutte le colonne nei risultati sono uguali), UNION ALLno.

Si verifica un aumento delle prestazioni quando si utilizza UNIONinvece di UNION ALL, poiché il server di database deve fare un lavoro aggiuntivo per rimuovere le righe duplicate, ma di solito non si desidera i duplicati (specialmente durante lo sviluppo di report).

Esempio UNION:

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

Risultato:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

UNION ALL esempio:

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar

Risultato:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)

179
Ciò implica che l'unione è molto meno performante in quanto deve scansionare il risultato alla ricerca di duplicati
Matthew Watson,

19
UNION ALL sarà davvero più performante, in particolare a causa della mancanza di questo tipo distinto. La mia pratica generale è quella di utilizzare UNION ALL a meno che non vogliano duplicati.
Adam Caviness,

6
Ho appena notato che ci sono molti buoni commenti / risposte qui, quindi ho attivato la bandiera wiki e ho aggiunto una nota sulle prestazioni ...
Jim Harte

250
UNION ALL può essere più lento di UNION nei casi del mondo reale in cui la rete come Internet è un collo di bottiglia. Il costo del trasferimento di più righe duplicate può superare il vantaggio del tempo di esecuzione della query. Questo deve essere analizzato caso per caso.
Charles Burns,

23
@AdamCaviness Il tuo commento non ha molto senso.
kojow7,

285

Sia UNION che UNION ALL concatenano il risultato di due diversi SQL. Differiscono nel modo in cui gestiscono i duplicati.

  • UNION esegue un DISTINCT sul set di risultati, eliminando le righe duplicate.

  • UNION ALL non rimuove i duplicati, quindi è più veloce di UNION.

Nota: durante l'utilizzo di questi comandi tutte le colonne selezionate devono essere dello stesso tipo di dati.

Esempio: se abbiamo due tabelle, 1) Dipendente e 2) Cliente

  1. Dati della tabella dei dipendenti:

inserisci qui la descrizione dell'immagine

  1. Dati della tabella dei clienti:

inserisci qui la descrizione dell'immagine

  1. Esempio UNION (rimuove tutti i record duplicati):

inserisci qui la descrizione dell'immagine

  1. Esempio UNION ALL (Concatena solo i record, non elimina i duplicati, quindi è più veloce di UNION):

inserisci qui la descrizione dell'immagine


3
"tutte le colonne selezionate devono essere dello stesso tipo di dati" - in realtà, le cose non sono così rigorose (non è una buona cosa dal punto di vista del modello relazionale!). Lo standard SQL afferma che il rispettivo descrittore di colonna deve essere lo stesso tranne nel nome.
Onedayquen

47

UNIONrimuove i duplicati, mentre UNION ALLnon lo fa.

Per rimuovere i duplicati, è necessario ordinare il set di risultati e ciò potrebbe avere un impatto sulle prestazioni di UNION, a seconda del volume di dati da ordinare e delle impostazioni di vari parametri RDBMS (per Oracle PGA_AGGREGATE_TARGETcon WORKAREA_SIZE_POLICY=AUTOo SORT_AREA_SIZEe SOR_AREA_RETAINED_SIZEse WORKAREA_SIZE_POLICY=MANUAL).

Fondamentalmente, l'ordinamento è più veloce se può essere eseguito in memoria, ma si applica lo stesso avvertimento sul volume di dati.

Naturalmente, se è necessario restituire i dati senza duplicati, è necessario utilizzare UNION, a seconda della fonte dei dati.

Avrei commentato il primo post per qualificare il commento "è molto meno performante", ma ho una reputazione insufficiente (punti) per farlo.


1
"Per rimuovere i duplicati il ​​set di risultati deve essere ordinato" - forse hai in mente un particolare fornitore ma non ci sono tag specifici del fornitore sulla domanda. Anche se ci fosse, potresti provare che i duplicati non possono essere rimossi senza l'ordinamento?
Onedayquen

2
distinto ordinerà "implicitamente" i risultati, poiché la rimozione dei duplicati è più rapida su un set ordinato. ciò non significa che il set di risultati restituito sia effettivamente ordinato in quel modo, ma nella maggior parte dei casi distinti (e quindi, UNION) ordinerà internamente l'insieme di risultati.
DevilSuichiro,

30

In ORACLE: UNION non supporta i tipi di colonna BLOB (o CLOB), UNION ALL lo supporta.



13

Puoi evitare duplicati e continuare a correre molto più velocemente di UNION DISTINCT (che in realtà è lo stesso di UNION) eseguendo una query in questo modo:

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

Notare la AND a!=Xparte. Questo è molto più veloce di UNION.


4
Ciò ometterà le righe e pertanto non riuscirà a produrre il risultato previsto se a contiene valori NULL. Inoltre, non restituisce ancora lo stesso risultato di a UNION- UNIONrimuove anche i duplicati restituiti dalle sottoquery, mentre il tuo approccio non lo farà.
Frank Schmitt,

@FrankSchmitt - grazie per questa risposta; questo po 'di subquery è esattamente quello che volevo sapere!
Doradus,

11

Solo per aggiungere i miei due centesimi alla discussione qui: si potrebbe capire l' UNIONoperatore come un UNIONE pura e orientata al SET - ad es. Set A = {2,4,6,8}, set B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}

Quando si hanno a che fare con insiemi, non si desidera che i numeri 2 e 4 compaiano due volte, in quanto un elemento è o non è in un insieme.

Nel mondo di SQL, tuttavia, potresti voler vedere tutti gli elementi dei due set insieme in un "sacchetto" {2,4,6,8,1,2,3,4}. E a questo scopo T-SQL offre all'operatore UNION ALL.


2
Nitpick: UNION ALLnon è "offerto" da T-SQL. UNION ALLfa parte dello standard ANSI SQL e non è specifico per MS SQL Server.
Frank Schmitt,

1
Il commento 'Nitpick' potrebbe implicare che non è possibile utilizzare "Union All" in TSQL, ma è possibile. Certo, il commento non lo dice , ma qualcuno che lo legge potrebbe inferirlo.
JosephDoggie,

10

UNIONE
Il UNIONcomando viene utilizzato per selezionare le informazioni correlate da due tabelle, proprio come il JOINcomando. Tuttavia, quando si utilizza il UNIONcomando, tutte le colonne selezionate devono essere dello stesso tipo di dati. Con UNION, vengono selezionati solo valori distinti.

UNION ALL
Il UNION ALLcomando è uguale al UNIONcomando, tranne quelloUNION ALL seleziona tutti i valori.

La differenza tra Unione Union allè quellaUnion all non eliminerà le righe duplicate, invece estrae tutte le righe da tutte le tabelle adattandole alle specifiche della query e le combina in una tabella.

Una UNIONdichiarazione fa effettivamente una SELECT DISTINCTserie di risultati. Se sai che tutti i record restituiti sono univoci dal tuo sindacato, utilizza UNION ALLinvece i risultati più rapidi.


8

Non sono sicuro che sia importante quale database

UNIONe UNION ALLdovrebbe funzionare su tutti i server SQL.

Evitare inutili UNIONs sono enormi perdite di prestazioni. Come regola pratica, utilizzare UNION ALLse non si è sicuri di quale utilizzare.


Non esiste un tag SQL Server su questa domanda. Penso che l'opzione che restituisce i duplicati solo perché di solito ha prestazioni migliori è il consiglio sbagliato.
Onedayquen

1
@onedayquando credo che l'OP abbia usato la frase "SQL Server" come sinonimo di tutti gli RDBMS (ad esempio MySQL, PostGreSQL, Oracle, SQL Server). La formulazione è sfortunata, però (e ovviamente, potrei sbagliarmi).
Frank Schmitt,

@FrankSchmitt: nessuno dei prodotti che hai elencato è veramente RDBMS :)
onedaywhen

1
@onedayquando cura di elaborare? Almeno en.wikipedia.org/wiki/Relational_database_management_system sembra essere d'accordo con me - menziona esplicitamente Microsoft SQL Server, Oracle Database e MySQL. Oppure sei pignolo sulla differenza tra Oracle e Oracle Database, ad esempio?
Frank Schmitt,

8

UNION - genera record distinti

mentre

UNION ALL - genera tutti i record inclusi i duplicati.

Entrambi sono operatori di blocco e quindi personalmente preferisco usare JOINS su Blocking Operators (UNION, INTERSECT, UNION ALL ecc.) In qualsiasi momento.

Per illustrare perché l'operazione dell'Unione ha prestazioni scarse rispetto a Union All, controlla il seguente esempio.

CREATE TABLE #T1 (data VARCHAR(10))

INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'


CREATE TABLE #T2 (data VARCHAR(10))

INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'

inserisci qui la descrizione dell'immagine

Di seguito sono riportati i risultati delle operazioni UNION ALL e UNION.

inserisci qui la descrizione dell'immagine

Un'istruzione UNION esegue effettivamente un SELECT DISTINCT sul set di risultati. Se sai che tutti i record restituiti sono unici dal tuo sindacato, usa UNION ALL, invece, darà risultati più veloci.

L'uso di UNION comporta operazioni di ordinamento distinto nel piano di esecuzione. La prova per provare questa affermazione è mostrata di seguito:

inserisci qui la descrizione dell'immagine


3
Tutto in questa risposta è già stato detto, è troppo confuso per essere utile (suggerire di unirsi ai sindacati quando fanno cose diverse, dare "blocco" come motivo senza spiegare cosa intendi con quello o a quali server di database si applica), oppure è molto fuorviante (le percentuali nella schermata non sono applicabili al reale utilizzo effettivo di UNION/ UNION ALL).

Gli operatori bloccanti sono operatori ben noti in TSQL. Tutto ciò che fanno gli operatori di blocco può essere realizzato da Joins ma non viceversa. L'operazione di ordinamento distinto è cerchiata nella figura per mostrare perché l'unione funziona meglio di quella e anche per mostrare esattamente dove esiste nel piano di esecuzione. Sentiti libero di aggiungere più dati ai tavoli T1 e T2 per giocare con le percentuali!
DBA,

Tecnicamente PUOI produrre i risultati uniondell'utilizzo di una combinazione di joins e alcune s davvero brutte case, ma rende la query dannatamente quasi impossibile da leggere e mantenere, e nella mia esperienza è anche terribile per le prestazioni. Confronto: select foo.bar from foo union select fizz.buzz from fizzcontroselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
Devin Lamothe,

@DBA La tua risposta è rilevante solo per gli utenti di MS SQL Server. L'OP non ha mai menzionato l'RDBMS che stanno usando - potrebbero usare MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt,

6

unione viene utilizzata per selezionare valori distinti da due tabelle in cui come unione tutto viene utilizzato per selezionare tutti i valori inclusi i duplicati dalle tabelle


6

È bene capire con un diagramma di Venn.

ecco il link alla fonte. C'è una buona descrizione

inserisci qui la descrizione dell'immagine


5
La tua seconda foto suggerisce che i due si escludono a vicenda quando non lo sono. L'immagine dovrebbe piuttosto mostrare la stessa della prima ma con l'ellisse di intersezione ()mostrata una seconda volta. In realtà, ripensandoci, poiché il union allrisultato non è un insieme, non dovresti cercare di disegnarlo usando un diagramma di Venn!
Onedayquen

5

(Dal libro online di Microsoft SQL Server)

UNIONE [TUTTO]

Specifica che più set di risultati devono essere combinati e restituiti come un singolo set di risultati.

TUTTI

Incorpora tutte le righe nei risultati. Questo include duplicati. Se non specificato, le righe duplicate vengono rimosse.

UNIONimpiegherà troppo tempo quando una riga duplicata che trova like DISTINCTviene applicata ai risultati.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

è equivalente a:

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT

Un effetto collaterale dell'applicazione DISTINCTsui risultati è un'operazione di ordinamento sui risultati.

UNION ALLi risultati verranno mostrati come ordine arbitrario sui risultati, ma i UNIONrisultati verranno mostrati come ORDER BY 1, 2, 3, ..., n (n = column number of Tables)applicati ai risultati. Puoi vedere questo effetto collaterale quando non hai righe duplicate.


5

Aggiungo un esempio,

UNION , si sta unendo a distinto -> più lento, perché deve essere confrontato (nello sviluppatore Oracle SQL, scegli query, premi F10 per visualizzare l'analisi dei costi).

UNION ALL , si sta fondendo senza distinti -> più veloci.

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

e

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

2

UNION unisce il contenuto di due tabelle strutturalmente compatibili in un'unica tabella combinata.

  • Differenza:

La differenza tra UNIONe UNION ALLè che UNION willomette i record duplicati mentre UNION ALLincluderà i record duplicati.

UnionIl set di risultati è ordinato in ordine crescente, mentre il UNION ALLset di risultati non è ordinato

UNIONesegue un DISTINCTrelativo set di risultati in modo da eliminare eventuali righe duplicate. Considerando UNION ALLche non rimuoverà i duplicati e quindi è più veloce di UNION. *

Nota : le prestazioni di UNION ALLsaranno in genere migliori di UNION, poiché UNIONrichiede al server di svolgere il lavoro aggiuntivo di rimozione di duplicati. Quindi, nei casi in cui è certo che non ci saranno duplicati o in cui i duplicati non sono un problema, UNION ALLsi consiglia l' uso di per motivi di prestazioni.


1
"Il set di risultati dell'Unione è ordinato in ordine crescente" - A meno che non sia presente ORDER BY, i risultati ordinati non sono garantiti. Forse hai in mente un particolare fornitore SQL (anche allora, in ordine crescente cosa esattamente ...?) Ma questa domanda non ha tag fornitore = specifici.
Onedayquen

"unisce i contenuti di due tabelle strutturalmente compatibili" - Penso che tu abbia dichiarato questa parte davvero bene :)
onedayquen

2

Supponi di avere un insegnante e uno studente a due tavoli

Entrambi hanno 4 colonne con un nome diverso come questo

Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))

inserisci qui la descrizione dell'immagine

Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)

inserisci qui la descrizione dell'immagine

È possibile applicare UNION o UNION ALL per quelle due tabelle che hanno lo stesso numero di colonne. Ma hanno nome o tipo di dati diversi.

Quando si applica l' UNIONoperazione su 2 tabelle, trascura tutte le voci duplicate (il valore di tutte le colonne della riga in una tabella è uguale a un'altra tabella). Come questo

SELECT * FROM Student
UNION
SELECT * FROM Teacher

il risultato sarà

inserisci qui la descrizione dell'immagine

Quando si applica l' UNION ALLoperazione su 2 tabelle, restituisce tutte le voci con duplicato (se esiste una differenza tra qualsiasi valore di colonna di una riga in 2 tabelle). Come questo

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

Produzione inserisci qui la descrizione dell'immagine

Prestazione:

Ovviamente UNION TUTTE le prestazioni sono migliori di UNION poiché svolgono attività aggiuntive per rimuovere i valori duplicati. Puoi verificarlo da Tempo stimato di esecuzione premendo ctrl + L su MSSQL


Veramente? Per un risultato di quattro righe ?! Penserei che questo sia uno scenario in cui vorresti usare UNIONper comunicare l'intento (cioè senza duplicati) perché UNION ALLè improbabile che tu possa ottenere in termini assoluti qualsiasi miglioramento delle prestazioni della vita reale.
Onedayquen

2

In parole molto semplici, la differenza tra UNION e UNION ALL è che UNION ometterà i record duplicati mentre UNION ALL includerà record duplicati.


1

Un'altra cosa che vorrei aggiungere-

Unione : - Il set di risultati è ordinato in ordine crescente.

Union All : - Il set di risultati non è ordinato. l'output di due query viene appena aggiunto.


Vero ! UNION potrebbe cambiare l'ordine dei due risultati secondari.
gracco,

6
Questo è sbagliato. Una UNIONsarà NON sorta il risultato in ordine crescente. Qualsiasi ordinamento che vedi in un risultato senza usare order byè una pura coincidenza. Il DBMS è libero di utilizzare qualsiasi strategia che ritenga efficace per rimuovere i duplicati. Questo potrebbe essere l'ordinamento, ma potrebbe anche essere un algoritmo di hashing o qualcosa di completamente diverso - e la strategia cambierà con il numero di righe. A unionche appare ordinato con 100 righe potrebbe non essere con 100.000 righe
a_horse_with_no_name

2
Senza una clausola ORDER BY sulla query, RDBMS è libero di restituire le righe in qualsiasi sequenza. L'osservazione che il risultato impostato da un'operazione UNION viene restituito "in ordine crescente" è solo un sottoprodotto di un'operazione di "ordinamento univoco" eseguita dal database. Il comportamento osservato non è garantito. Quindi non fare affidamento su di esso. Se la specifica deve restituire le righe in un ordine particolare, aggiungere una ORDER BYclausola appropriata .
spencer7593,

1

Differenza tra Union Vs Union TUTTO in mq

Cos'è Union In SQL?

L'operatore UNION viene utilizzato per combinare il set di risultati di due o più set di dati.

Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order

Unione Vs Unione Tutti Con Esempio


1

Importante! Differenza tra Oracle e Mysql: diciamo che t1 t2 non ha righe duplicate tra loro ma hanno righe duplicate individuali. Esempio: t1 ha vendite dal 2017 e t2 dal 2018

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

In ORACLE UNION ALL recupera tutte le righe da entrambe le tabelle. Lo stesso accadrà in MySQL.

Però:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

In ORACLE , UNION recupera tutte le righe da entrambe le tabelle perché non ci sono valori duplicati tra t1 e t2. D'altra parte in MySQL il set di risultati avrà meno righe perché ci saranno righe duplicate nella tabella t1 e anche nella tabella t2!


0

UNION rimuove i record duplicati invece UNION ALL no. Ma è necessario controllare la maggior parte dei dati che verranno elaborati e la colonna e il tipo di dati devono essere uguali.

poiché l'unione utilizza internamente un comportamento "distinto" per selezionare le righe, quindi è più costoso in termini di tempo e prestazioni. piace

select project_id from t_project
union
select project_id from t_project_contact  

questo mi dà record per il 2020

d'altra parte

select project_id from t_project
union all
select project_id from t_project_contact

mi dà più di 17402 righe

in prospettiva di precedenza entrambi hanno la stessa precedenza.


0

In caso contrario ORDER BY, a UNION ALLpuò riportare le righe mentre procede, mentre a UNIONti farebbe attendere fino alla fine della query prima di fornirti l'intero set di risultati in una sola volta. Ciò può fare la differenza in una situazione di timeout: aUNION ALL mantiene viva la connessione, per così dire.

Quindi, se hai un problema di timeout e non c'è ordinamento e i duplicati non sono un problema, UNION ALLpuò essere piuttosto utile.


Ma il tuo primo blocco di risultati potrebbe essere duplicato una sola volta più volte: quanto è utile ?!
Onedayquen

0

UNION e UNION ALL sono stati utilizzati per combinare due o più risultati della query.

Il comando UNION seleziona informazioni distinte e correlate da due tabelle che elimineranno le righe duplicate.

D'altra parte, il comando UNION ALL seleziona tutti i valori da entrambe le tabelle, che visualizza tutte le righe.


0

Come abitudine, utilizzare sempre UNION ALL . Utilizzare solo UNION in casi speciali quando è necessario eliminare i duplicati che possono essere estremamente disordinati e si può leggere tutto negli altri commenti qui.


0

UNION ALLfunziona anche su più tipi di dati. Ad esempio, quando si tenta di unire tipi di dati spaziali. Per esempio:

select a.SHAPE from tableA a
union
select b.SHAPE from tableB b

getterà

The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.

Tuttavia union allnon lo farà.


-1

L'unica differenza è:

"UNION" rimuove le righe duplicate.

"UNION ALL" non rimuove le righe duplicate.


13
In che modo questo aggiunge valore rispetto alla risposta accettata?
Nick

@ Nick È una risposta più breve.
Mostafa Vatanpour,

Più breve potrebbe essere un vantaggio se dovessi leggere una parte significativa della risposta accettata per ottenere questi dati. Ma in questo caso la risposta accettata contiene tutte queste informazioni nella prima frase dopo la quale continua a discutere le implicazioni della differenza nei dettagli.
dmckee --- ex gattino moderatore,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.