Qual é a diferença entre UNION e UNION ALL?

Respostas:

1734

UNIONremove registros duplicados (onde todas as colunas nos resultados são iguais), UNION ALLnão.

Há um impacto no desempenho ao usar em UNIONvez de UNION ALL, pois o servidor de banco de dados deve executar um trabalho adicional para remover as linhas duplicadas, mas geralmente você não deseja as duplicatas (especialmente ao desenvolver relatórios).

Exemplo UNION:

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

Resultado:

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

Exemplo UNION ALL:

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

Resultado:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Robbie Averill
fonte
179
A implicação disso é que a união tem muito menos desempenho, pois deve procurar o resultado em busca de duplicatas
558 Matthew Watson
19
UNION ALL será, de fato, mais eficiente, especificamente devido à falta do tipo distinto. Minha prática geral é usar UNION ALL, a menos que eu queira especificamente duplicatas.
Adam Caviness
6
Só notei que há um monte de bons comentários / respostas aqui, então eu ligado a bandeira wiki e acrescentou uma nota sobre o desempenho ...
Jim Harte
250
UNION ALL pode ser mais lento que UNION em casos do mundo real, onde a rede, como a Internet, é um gargalo. O custo da transferência de muitas linhas duplicadas pode exceder o benefício do tempo de execução da consulta. Isso deve ser analisado caso a caso.
Charles Burns
23
@AdamCaviness Seu comentário não faz muito sentido.
precisa saber é o seguinte
285

UNION e UNION ALL concatenam o resultado de dois SQLs diferentes. Eles diferem na maneira como lidam com duplicatas.

  • UNION executa um DISTINCT no conjunto de resultados, eliminando quaisquer linhas duplicadas.

  • UNION ALL não remove duplicatas e, portanto, é mais rápido que UNION.

Nota: Ao usar este comando, todas as colunas selecionadas precisam ter o mesmo tipo de dados.

Exemplo: se tivermos duas tabelas, 1) Funcionário e 2) Cliente

  1. Dados da tabela de funcionários:

insira a descrição da imagem aqui

  1. Dados da tabela de clientes:

insira a descrição da imagem aqui

  1. Exemplo UNION (remove todos os registros duplicados):

insira a descrição da imagem aqui

  1. Exemplo UNION ALL (apenas concatena registros, não elimina duplicatas, por isso é mais rápido que UNION):

insira a descrição da imagem aqui

Bhaumik Patel
fonte
3
"todas as colunas selecionadas precisam ter o mesmo tipo de dados" - na verdade, as coisas não são tão rígidas (não é uma coisa boa do ponto de vista do modelo relacional!). O padrão SQL diz que o respectivo descritor de coluna deve ser o mesmo, exceto no nome.
usar o seguinte código
47

UNIONremove duplicatas, enquanto UNION ALLque não.

Para remover duplicatas, o conjunto de resultados deve ser classificado, e isso pode afetar o desempenho do UNION, dependendo do volume de dados que está sendo classificado e das configurações de vários parâmetros do RDBMS (para Oracle PGA_AGGREGATE_TARGETcom WORKAREA_SIZE_POLICY=AUTOou SORT_AREA_SIZEe SOR_AREA_RETAINED_SIZEse WORKAREA_SIZE_POLICY=MANUAL).

Basicamente, a classificação é mais rápida se puder ser realizada na memória, mas a mesma ressalva sobre o volume de dados se aplica.

Obviamente, se você precisar de dados retornados sem duplicatas, deverá usar o UNION, dependendo da fonte dos seus dados.

Eu teria comentado no primeiro post para qualificar o comentário "é muito menos eficiente", mas não tenho reputação (pontos) suficiente para fazê-lo.

mathewbutler
fonte
1
"Para remover duplicatas, o conjunto de resultados deve ser classificado" - talvez você tenha um fornecedor específico em mente, mas não há tags específicas do fornecedor na pergunta. Mesmo se houvesse, você poderia provar que duplicatas não podem ser removidas sem classificação?
usar o seguinte código
2
O distinto classificará "implicitamente" os resultados, porque a remoção de duplicatas é mais rápida em um conjunto classificado. isso não significa que o conjunto de resultados retornado seja realmente classificado dessa maneira, mas na maioria dos casos distintos (e, portanto, UNION) classificarão internamente o conjunto de resultados.
DevilSuichiro
30

No ORACLE: UNION não suporta tipos de coluna BLOB (ou CLOB), UNION ALL.

Michiel Overeem
fonte
13

Você pode evitar duplicatas e ainda executar muito mais rápido que UNION DISTINCT (que é realmente o mesmo que UNION) executando uma consulta como esta:

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

Observe a AND a!=Xparte. Isso é muito mais rápido que o UNION.

Ihor Vorotnov
fonte
4
Isso omitirá linhas e, portanto, falhará em produzir o resultado esperado se a contiver valores NULL. Além disso, ele ainda não retorna o mesmo resultado que um UNION- UNIONtambém remove duplicatas retornadas pelas subconsultas, enquanto sua abordagem não retorna.
19417 Frank Schmitt
@FrankSchmitt - obrigado por esta resposta; esse pouco sobre subconsultas é exatamente o que eu queria saber!
307 Doradus
11

Apenas para adicionar meus dois centavos à discussão aqui: é possível entender o UNIONoperador como uma UNIÃO pura e orientada para o SET - por exemplo, conjunto A = {2,4,6,8}, conjunto B = {1,2,3,4 }, A UNIÃO B = {1,2,3,4,6,8}

Ao lidar com conjuntos, você não deseja que os números 2 e 4 apareçam duas vezes, pois um elemento está ou não em um conjunto.

No mundo do SQL, no entanto, você pode querer ver todos os elementos dos dois conjuntos juntos em um "saco" {2,4,6,8,1,2,3,4}. E para esse fim, o T-SQL oferece ao operador UNION ALL.

Peter Perháč
fonte
2
Nitpick: UNION ALLnão é "oferecido" pelo T-SQL. UNION ALLfaz parte do padrão ANSI SQL e não é específico para o MS SQL Server.
Frank Schmitt
1
O comentário 'Nitpick' pode sugerir que você não pode usar "Union All" no TSQL, mas você pode. Obviamente, o comentário não diz isso, mas alguém que o lê pode inferir.
JosephDoggie
10

UNION
O UNIONcomando é usado para selecionar informações relacionadas de duas tabelas, bem como o JOINcomando. No entanto, ao usar o UNIONcomando, todas as colunas selecionadas precisam ter o mesmo tipo de dados. Com UNION, apenas valores distintos são selecionados.

UNION ALL
O UNION ALLcomando é igual ao UNIONcomando, exceto que UNION ALLseleciona todos os valores.

A diferença entre Unione Union allé que Union allnão eliminará linhas duplicadas, apenas puxa todas as linhas de todas as tabelas que se ajustam às especificidades de sua consulta e as combina em uma tabela.

Uma UNIONdeclaração efetivamente faz um SELECT DISTINCTno conjunto de resultados. Se você souber que todos os registros retornados são exclusivos do seu sindicato, use UNION ALL-o para obter resultados mais rápidos.

DotNetGuy
fonte
8

Não tenho certeza de que importa qual banco de dados

UNIONe UNION ALLdeve funcionar em todos os servidores SQL.

Você deve evitar desnecessários, UNIONpois eles são um grande vazamento de desempenho. Como regra geral, use UNION ALLse você não tiver certeza de qual usar.

Jakub Šturc
fonte
Não existe uma etiqueta do SQL Server nesta questão. Penso que a opção que devolve duplicados apenas porque é habitual o melhor desempenho é o conselho errado.
precisa saber é o seguinte
1
@onedaywhen acho que o OP usou a frase "SQL Servers" como sinônimo de todos os RDBMSs (por exemplo, MySQL, PostGreSQL, Oracle, SQL Server). A redação é lamentável, no entanto (e, é claro, posso estar enganado).
Frank Schmitt
@FrankSchmitt: nenhum dos produtos que você listou são verdadeiramente RDBMSs :)
onedaywhen
1
@onedaywhen cuidado para elaborar? Pelo menos en.wikipedia.org/wiki/Relational_database_management_system parece concordar comigo - menciona explicitamente o Microsoft SQL Server, o Oracle Database e o MySQL. Ou você é categórico quanto à diferença entre o Oracle e o Oracle Database, por exemplo?
Frank Schmitt
8

UNION - resulta em registros distintos ,

enquanto

UNION ALL - resulta em todos os registros, incluindo duplicatas.

Ambos são operadores de bloqueio e, portanto, eu pessoalmente prefiro usar JOINS em vez de operadores de bloqueio (UNION, INTERSECT, UNION ALL etc.) a qualquer momento.

Para ilustrar por que a operação da União apresenta um desempenho ruim em comparação com o checkout da União Todos no exemplo a seguir.

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'

insira a descrição da imagem aqui

A seguir, são apresentados os resultados das operações UNION ALL e UNION.

insira a descrição da imagem aqui

Uma instrução UNION efetivamente faz um SELECT DISTINCT no conjunto de resultados. Se você souber que todos os registros retornados são exclusivos de sua união, use UNION ALL, pois isso gera resultados mais rápidos.

O uso de UNION resulta em operações de Classificação Distinta no Plano de Execução. A prova para provar esta afirmação é mostrada abaixo:

insira a descrição da imagem aqui

DBA
fonte
3
Tudo nesta resposta já foi dito, é muito confuso para ser útil (sugerir associações aos sindicatos quando eles fazem coisas diferentes, dando "bloqueio" como uma razão sem explicar o que você quer dizer com isso ou em quais servidores de banco de dados ele se aplica), ou é altamente enganador (suas porcentagens na captura de tela não são aplicáveis ​​ao uso real real de UNION/ UNION ALL).
Operadores de bloqueio são operadores bem conhecidos no TSQL. Tudo o que os operadores de bloqueio fazem pode ser conseguido pelo Joins, mas não vice-versa. A operação de classificação distinta é circulada na figura para mostrar por que a união funciona melhor que a união e também para mostrar exatamente onde ela existe no plano de execução. Sinta-se livre para adicionar mais dados às tabelas T1 e T2 para brincar com as porcentagens!
DBA
Tecnicamente, você PODE produzir os resultados de uma unioncombinação de joins e alguns realmente sórdidos case, mas isso torna quase impossível a leitura e a manutenção da consulta e, na minha experiência, também é terrível para o desempenho. Compare: select foo.bar from foo union select fizz.buzz from fizzcontraselect 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 17/10
@DBA Sua resposta é relevante apenas para usuários do MS SQL Server. O OP nunca mencionou os RDBMS que eles estão usando - eles poderiam estar usando MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt
6

union é usado para selecionar valores distintos de duas tabelas, onde, como union all, é usado para selecionar todos os valores, incluindo duplicatas das tabelas.


fonte
6

É bom entender com um diagrama de Venn.

Aqui está o link para a fonte. Há uma boa descrição.

insira a descrição da imagem aqui

michael-mammut
fonte
5
Sua segunda imagem sugere que as duas são mutuamente exclusivas quando não são. A imagem deve mostrar o mesmo que a primeira, mas com a 'elipse de interseção' ()mostrada uma segunda vez. Na verdade, pensando bem, porque o union allresultado não é um conjunto, você não deve tentar desenhá-lo usando um diagrama de Venn!
precisa saber é o seguinte
5

(Do Microsoft SQL Server Book Online)

UNIÃO [TODOS]

Especifica que vários conjuntos de resultados devem ser combinados e retornados como um único conjunto de resultados.

TODOS

Incorpora todas as linhas nos resultados. Isso inclui duplicatas. Se não especificado, as linhas duplicadas serão removidas.

UNIONlevará muito tempo se uma linha duplicada encontrar como DISTINCTfor aplicada nos resultados.

SELECT * FROM Table1
UNION
SELECT * FROM Table2

é equivalente a:

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

Um efeito colateral da aplicação DISTINCTsobre os resultados é uma operação de classificação nos resultados.

UNION ALLos resultados serão mostrados como ordem arbitrária nos resultados, mas os UNIONresultados serão mostrados como ORDER BY 1, 2, 3, ..., n (n = column number of Tables)aplicados nos resultados. Você pode ver esse efeito colateral quando não possui nenhuma linha duplicada.

shA.t
fonte
5

Eu adiciono um exemplo

UNION , ele está se mesclando com distinto -> mais lento, porque precisa ser comparado (no desenvolvedor do Oracle SQL, escolha a consulta, pressione F10 para ver a análise de custo).

UNION ALL , está se unindo sem distinção -> mais rápido.

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;
Do Nhu Vy
fonte
2

UNION mescla o conteúdo de duas tabelas estruturalmente compatíveis em uma única tabela combinada.

  • Diferença:

A diferença entre UNIONe UNION ALLé que UNION willomitem registros duplicados e que UNION ALLincluem registros duplicados.

UnionO conjunto de resultados é classificado em ordem crescente, enquanto o UNION ALLconjunto de resultados não é classificado

UNIONexecuta um DISTINCTem seu conjunto de resultados para eliminar quaisquer linhas duplicadas. Considerando UNION ALLque não removerá duplicatas e, portanto, é mais rápido que UNION. *

Nota : O desempenho de UNION ALLnormalmente será melhor do que UNION, uma vez que UNIONrequer que o servidor execute o trabalho adicional de remover duplicatas. Portanto, nos casos em que é certo que não haverá duplicatas ou onde a duplicação não é um problema, o uso de UNION ALLseria recomendado por razões de desempenho.

pedram
fonte
1
"O conjunto de resultados da união é classificado em ordem crescente" - A menos que exista ORDER BY, os resultados classificados não são garantidos. Talvez você tenha um fornecedor SQL específico em mente (mesmo assim, em ordem crescente o que exatamente ...?), Mas esta pergunta não tem tags específicas de fornecedor =.
usar o seguinte código
"mescla o conteúdo de duas tabelas estruturalmente compatíveis" - acho que você declarou esta parte muito bem :)
onedaywhen
2

Suponha que você tenha duas tabelas Professor e Aluno

Ambos têm 4 colunas com nome diferente como este

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Você pode aplicar UNION ou UNION ALL para as duas tabelas que possuem o mesmo número de colunas. Mas eles têm um nome ou tipo de dados diferente.

Quando você aplica a UNIONoperação em 2 tabelas, ela negligencia todas as entradas duplicadas (o valor de todas as colunas da linha em uma tabela é igual a outra tabela). Como isso

SELECT * FROM Student
UNION
SELECT * FROM Teacher

o resultado será

insira a descrição da imagem aqui

Quando você aplica a UNION ALLoperação em 2 tabelas, ele retorna todas as entradas duplicadas (se houver alguma diferença entre qualquer valor de coluna de uma linha em 2 tabelas). Como isso

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

Resultado insira a descrição da imagem aqui

Atuação:

Obviamente, o desempenho de UNION ALL é melhor que UNION, pois eles executam tarefas adicionais para remover os valores duplicados. Você pode verificar isso no tempo estimado de execução pressionando ctrl + L no MSSQL

reza.cse08
fonte
Mesmo? Para um resultado de quatro linhas ?! Eu acho que esse é um cenário em que você gostaria de usar UNIONpara transmitir intenções (ou seja, sem duplicatas), porque UNION ALLé improvável que se obtenha algum ganho de desempenho na vida real em termos absolutos.
usar o seguinte código
2

Em palavras muito simples, a diferença entre UNION e UNION ALL é que UNION omitirá registros duplicados, enquanto UNION ALL incluirá registros duplicados.

Shubham Pandey
fonte
1

Mais uma coisa que gostaria de acrescentar:

União : - O conjunto de resultados é classificado em ordem crescente.

União de todos : - O conjunto de resultados não está classificado. duas saídas de consulta são anexadas.

Rahul Sawant
fonte
Verdade ! UNION pode alterar a ordem dos dois sub-resultados.
Graco
6
Isto está errado. Um UNIONirá NÃO tipo o resultado em ordem crescente. Qualquer pedido que você vê em um resultado sem usar order byé pura coincidência. O DBMS é livre para usar qualquer estratégia que considere eficiente para remover as duplicatas. Esta pode ser a classificação, mas também poderia ser um algoritmo de hash ou algo completamente diferente - e a estratégia vai mudar com o número de linhas. Um unionque aparece classificado com 100 linhas pode não estar com 100.000 linhas
a_horse_with_no_name 27/04
2
Sem uma cláusula ORDER BY na consulta, o RDBMS está livre para retornar as linhas em qualquer sequência. A observação de que o conjunto de resultados de uma operação UNION é retornada "em ordem crescente" é apenas um subproduto de uma operação "classificação exclusiva" executada pelo banco de dados. O comportamento observado não é garantido. Portanto, não confie nisso. Se a especificação for retornar linhas em uma ordem específica, adicione uma ORDER BYcláusula apropriada .
spencer7593
1

Diferença entre Union vs Union ALL em Sql

O que é o Union In SQL?

O operador UNION é usado para combinar o conjunto de resultados de dois ou mais conjuntos de dados.

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

União contra União, tudo com exemplo

Sandeep TK
fonte
1

Importante! Diferença entre Oracle e Mysql: Digamos que t1 t2 não possui linhas duplicadas entre elas, mas elas possuem linhas duplicadas individuais. Exemplo: t1 tem vendas a partir de 2017 e t2 a partir de 2018

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

No ORACLE UNION, TODAS busca todas as linhas das duas tabelas. O mesmo ocorrerá no MySQL.

Contudo:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

No ORACLE , UNION busca todas as linhas de ambas as tabelas porque não há valores duplicados entre t1 e t2. Por outro lado, no MySQL, o conjunto de resultados terá menos linhas, porque haverá linhas duplicadas na tabela t1 e também na tabela t2!

Aris Mist
fonte
0

UNION remove registros duplicados por outro lado, UNION ALL não. Mas é preciso verificar a maior parte dos dados que serão processados ​​e a coluna e o tipo de dados devem ser os mesmos.

Como a união usa internamente um comportamento "distinto" para selecionar as linhas, é mais caro em termos de tempo e desempenho. gostar

select project_id from t_project
union
select project_id from t_project_contact  

isso me dá 2020 registros

por outro lado

select project_id from t_project
union all
select project_id from t_project_contact

me dá mais de 17402 linhas

na perspectiva de precedência, ambos têm a mesma precedência.

Pawan Kumar
fonte
0

Se não houver ORDER BY, a UNION ALLpoderá retornar as linhas conforme necessário, enquanto a UNIONfará com que você espere até o final da consulta antes de fornecer todo o conjunto de resultados de uma só vez. Isso pode fazer a diferença em uma situação de tempo limite - a UNION ALLmantém a conexão viva, por assim dizer.

Portanto, se você tiver um problema de tempo limite e não houver classificação e duplicatas não forem um problema, UNION ALL pode ser bastante útil.

AjV Jsy
fonte
Mas seu primeiro pedaço de resultados pode ser duplicado em uma linha várias vezes: qual a utilidade disso ?!
usar o seguinte código
0

UNION e UNION ALL costumavam combinar dois ou mais resultados da consulta.

O comando UNION seleciona informações distintas e relacionadas de duas tabelas que eliminam linhas duplicadas.

Por outro lado, o comando UNION ALL seleciona todos os valores das duas tabelas, que exibem todas as linhas.

Sona
fonte
0

Como hábito, use sempre UNION ALL . Use apenas UNION em casos especiais quando precisar eliminar duplicatas que podem ser extremamente complicadas e você pode ler tudo sobre os outros comentários aqui.

Clark Vera
fonte
0

UNION ALLtambém funciona em mais tipos de dados. Por exemplo, ao tentar unir tipos de dados espaciais. Por exemplo:

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

vai jogar

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

No entanto union allnão.

Dowlers
fonte
-1

A única diferença é:

"UNION" remove linhas duplicadas.

"UNION ALL" não remove linhas duplicadas.

Manoj Patel
fonte
13
Como isso agrega algum valor em comparação com a resposta aceita?
Nick
@ Nick É uma resposta mais curta.
Mostafa Vatanpour
Menor pode ser uma vantagem se você precisar ler uma parte significativa da resposta aceita para obter esses dados. Mas, neste caso, a resposta aceita contém todas essas informações na primeira frase, após a qual discute as implicações da diferença em detalhes.
dmckee --- gatinho ex-moderador