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 UNIONSELECT'foo'AS bar
Resultado:
+-----+| bar |+-----+| foo |+-----+1rowinset(0.00 sec)
Exemplo UNION ALL:
SELECT'foo'AS bar UNIONALLSELECT'foo'AS bar
Resultado:
+-----+| bar |+-----+| foo || foo |+-----+2rowsinset(0.00 sec)
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
Dados da tabela de funcionários:
Dados da tabela de clientes:
Exemplo UNION (remove todos os registros duplicados):
Exemplo UNION ALL (apenas concatena registros, não elimina duplicatas, por isso é mais rápido que UNION):
"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.
"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.
A diferença básica entre UNION e UNION ALL é a operação de união, que elimina as linhas duplicadas do conjunto de resultados, mas a união todas retorna todas as linhas após a união.
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.
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.
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.
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.
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.
A seguir, são apresentados os resultados das operações UNION ALL e UNION.
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:
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.
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.
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.
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.
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.
"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
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
UNIONSELECT*FROM Teacher
o resultado será
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
UNIONALLSELECT*FROM Teacher
Resultado
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
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.
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 withinUNION 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! 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
UNIONALLSELECT 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
UNIONSELECT 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!
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
unionselect project_id from t_project_contact
isso me dá 2020 registros
por outro lado
select project_id from t_project
unionallselect project_id from t_project_contact
me dá mais de 17402 linhas
na perspectiva de precedência, ambos têm a mesma precedência.
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.
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.
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.
Respostas:
UNION
remove registros duplicados (onde todas as colunas nos resultados são iguais),UNION ALL
não.Há um impacto no desempenho ao usar em
UNION
vez deUNION 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:
Resultado:
Exemplo UNION ALL:
Resultado:
fonte
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.
Exemplo: se tivermos duas tabelas, 1) Funcionário e 2) Cliente
fonte
UNION
remove duplicatas, enquantoUNION ALL
que 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_TARGET
comWORKAREA_SIZE_POLICY=AUTO
ouSORT_AREA_SIZE
eSOR_AREA_RETAINED_SIZE
seWORKAREA_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.
fonte
No ORACLE: UNION não suporta tipos de coluna BLOB (ou CLOB), UNION ALL.
fonte
de http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
fonte
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!=X
parte. Isso é muito mais rápido que o UNION.fonte
UNION
-UNION
também remove duplicatas retornadas pelas subconsultas, enquanto sua abordagem não retorna.Apenas para adicionar meus dois centavos à discussão aqui: é possível entender o
UNION
operador 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
.fonte
UNION ALL
não é "oferecido" pelo T-SQL.UNION ALL
faz parte do padrão ANSI SQL e não é específico para o MS SQL Server.UNION
O
UNION
comando é usado para selecionar informações relacionadas de duas tabelas, bem como oJOIN
comando. No entanto, ao usar oUNION
comando, todas as colunas selecionadas precisam ter o mesmo tipo de dados. ComUNION
, apenas valores distintos são selecionados.UNION ALL
O
UNION ALL
comando é igual aoUNION
comando, exceto queUNION ALL
seleciona todos os valores.A diferença entre
Union
eUnion all
é queUnion all
nã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
UNION
declaração efetivamente faz umSELECT DISTINCT
no conjunto de resultados. Se você souber que todos os registros retornados são exclusivos do seu sindicato, useUNION ALL
-o para obter resultados mais rápidos.fonte
UNION
eUNION ALL
deve funcionar em todos os servidores SQL.Você deve evitar desnecessários,
UNION
pois eles são um grande vazamento de desempenho. Como regra geral, useUNION ALL
se você não tiver certeza de qual usar.fonte
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.
A seguir, são apresentados os resultados das operações UNION ALL e UNION.
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:
fonte
UNION
/UNION ALL
).union
combinação dejoin
s e alguns realmente sórdidoscase
, 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 fizz
contraselect 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
union é usado para selecionar valores distintos de duas tabelas, onde, como union all, é usado para selecionar todos os valores, incluindo duplicatas das tabelas.
fonte
É bom entender com um diagrama de Venn.
Aqui está o link para a fonte. Há uma boa descrição.
fonte
()
mostrada uma segunda vez. Na verdade, pensando bem, porque ounion all
resultado não é um conjunto, você não deve tentar desenhá-lo usando um diagrama de Venn!(Do Microsoft SQL Server Book Online)
UNIÃO [TODOS]
TODOS
UNION
levará muito tempo se uma linha duplicada encontrar comoDISTINCT
for aplicada nos resultados.é equivalente a:
UNION ALL
os resultados serão mostrados como ordem arbitrária nos resultados, mas osUNION
resultados serão mostrados comoORDER 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.fonte
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.
e
fonte
UNION
mescla o conteúdo de duas tabelas estruturalmente compatíveis em uma única tabela combinada.A diferença entre
UNION
eUNION ALL
é queUNION will
omitem registros duplicados e queUNION ALL
incluem registros duplicados.Union
O conjunto de resultados é classificado em ordem crescente, enquanto oUNION ALL
conjunto de resultados não é classificadoUNION
executa umDISTINCT
em seu conjunto de resultados para eliminar quaisquer linhas duplicadas. ConsiderandoUNION ALL
que não removerá duplicatas e, portanto, é mais rápido queUNION
. *Nota : O desempenho de
UNION ALL
normalmente será melhor do queUNION
, uma vez queUNION
requer 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 deUNION ALL
seria recomendado por razões de desempenho.fonte
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 =.Suponha que você tenha duas tabelas Professor e Aluno
Ambos têm 4 colunas com nome diferente como este
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
UNION
operaçã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 issoo resultado será
Quando você aplica a
UNION ALL
operaçã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 issoResultado
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
fonte
UNION
para transmitir intenções (ou seja, sem duplicatas), porqueUNION ALL
é improvável que se obtenha algum ganho de desempenho na vida real em termos absolutos.Em palavras muito simples, a diferença entre UNION e UNION ALL é que UNION omitirá registros duplicados, enquanto UNION ALL incluirá registros duplicados.
fonte
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.
fonte
UNION
irá NÃO tipo o resultado em ordem crescente. Qualquer pedido que você vê em um resultado sem usarorder 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. Umunion
que aparece classificado com 100 linhas pode não estar com 100.000 linhasORDER BY
cláusula apropriada .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.
União contra União, tudo com exemplo
fonte
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
No ORACLE UNION, TODAS busca todas as linhas das duas tabelas. O mesmo ocorrerá no MySQL.
Contudo:
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!
fonte
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
isso me dá 2020 registros
por outro lado
me dá mais de 17402 linhas
na perspectiva de precedência, ambos têm a mesma precedência.
fonte
Se não houver
ORDER BY
, aUNION ALL
poderá retornar as linhas conforme necessário, enquanto aUNION
fará 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 - aUNION ALL
manté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.fonte
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.
fonte
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.
fonte
UNION ALL
também funciona em mais tipos de dados. Por exemplo, ao tentar unir tipos de dados espaciais. Por exemplo: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 all
não.fonte
A única diferença é:
"UNION" remove linhas duplicadas.
"UNION ALL" não remove linhas duplicadas.
fonte