Risposte:
UNION
rimuove i record duplicati (dove tutte le colonne nei risultati sono uguali), UNION ALL
no.
Si verifica un aumento delle prestazioni quando si utilizza UNION
invece 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).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Risultato:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Risultato:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
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
UNION
rimuove i duplicati, mentre UNION ALL
non 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_TARGET
con WORKAREA_SIZE_POLICY=AUTO
o SORT_AREA_SIZE
e SOR_AREA_RETAINED_SIZE
se 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.
In ORACLE: UNION non supporta i tipi di colonna BLOB (o CLOB), UNION ALL lo supporta.
La differenza di base tra UNION e UNION ALL è che l'operazione di unione elimina le righe duplicate dal set di risultati ma l'unione di tutte restituisce tutte le righe dopo l'unione.
da http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
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!=X
parte. Questo è molto più veloce di UNION.
UNION
- UNION
rimuove anche i duplicati restituiti dalle sottoquery, mentre il tuo approccio non lo farà.
Solo per aggiungere i miei due centesimi alla discussione qui: si potrebbe capire l' UNION
operatore 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
.
UNION ALL
non è "offerto" da T-SQL. UNION ALL
fa parte dello standard ANSI SQL e non è specifico per MS SQL Server.
UNIONE
Il UNION
comando viene utilizzato per selezionare le informazioni correlate da due tabelle, proprio come il JOIN
comando. Tuttavia, quando si utilizza il UNION
comando, tutte le colonne selezionate devono essere dello stesso tipo di dati. Con UNION
, vengono selezionati solo valori distinti.
UNION ALL
Il UNION ALL
comando è uguale al UNION
comando, tranne quelloUNION ALL
seleziona tutti i valori.
La differenza tra Union
e 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 UNION
dichiarazione fa effettivamente una SELECT DISTINCT
serie di risultati. Se sai che tutti i record restituiti sono univoci dal tuo sindacato, utilizza UNION ALL
invece i risultati più rapidi.
Non sono sicuro che sia importante quale database
UNION
e UNION ALL
dovrebbe funzionare su tutti i server SQL.
Evitare inutili UNION
s sono enormi perdite di prestazioni. Come regola pratica, utilizzare UNION ALL
se non si è sicuri di quale utilizzare.
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'
Di seguito sono riportati i risultati delle operazioni UNION ALL e UNION.
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:
UNION
/ UNION ALL
).
union
dell'utilizzo di una combinazione di join
s 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 fizz
controselect 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
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
()
mostrata una seconda volta. In realtà, ripensandoci, poiché il union all
risultato non è un insieme, non dovresti cercare di disegnarlo usando un diagramma di Venn!
(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.
UNION
impiegherà troppo tempo quando una riga duplicata che trova like DISTINCT
viene 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
DISTINCT
sui risultati è un'operazione di ordinamento sui risultati.
UNION ALL
i risultati verranno mostrati come ordine arbitrario sui risultati, ma i UNION
risultati 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.
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;
UNION
unisce il contenuto di due tabelle strutturalmente compatibili in un'unica tabella combinata.
La differenza tra UNION
e UNION ALL
è che UNION will
omette i record duplicati mentre UNION ALL
includerà i record duplicati.
Union
Il set di risultati è ordinato in ordine crescente, mentre il UNION ALL
set di risultati non è ordinato
UNION
esegue un DISTINCT
relativo set di risultati in modo da eliminare eventuali righe duplicate. Considerando UNION ALL
che non rimuoverà i duplicati e quindi è più veloce di UNION
. *
Nota : le prestazioni di UNION ALL
saranno in genere migliori di UNION
, poiché UNION
richiede 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 ALL
si consiglia l' uso di per motivi di prestazioni.
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.
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))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
È 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' UNION
operazione 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à
Quando si applica l' UNION ALL
operazione 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
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
UNION
per comunicare l'intento (cioè senza duplicati) perché UNION ALL
è improbabile che tu possa ottenere in termini assoluti qualsiasi miglioramento delle prestazioni della vita reale.
In parole molto semplici, la differenza tra UNION e UNION ALL è che UNION ometterà i record duplicati mentre UNION ALL includerà record duplicati.
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.
UNION
sarà 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 union
che appare ordinato con 100 righe potrebbe non essere con 100.000 righe
ORDER BY
clausola appropriata .
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
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!
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.
In caso contrario ORDER BY
, a UNION ALL
può riportare le righe mentre procede, mentre a UNION
ti 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 ALL
può essere piuttosto utile.
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.
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.
UNION ALL
funziona 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 all
non lo farà.
L'unica differenza è:
"UNION" rimuove le righe duplicate.
"UNION ALL" non rimuove le righe duplicate.