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 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).
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Resultado:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Resultado:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
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
UNION
remove duplicatas, enquanto UNION 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
com WORKAREA_SIZE_POLICY=AUTO
ou SORT_AREA_SIZE
e SOR_AREA_RETAINED_SIZE
se 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.
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.
de http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
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.
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
.
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 o JOIN
comando. No entanto, ao usar o UNION
comando, todas as colunas selecionadas precisam ter o mesmo tipo de dados. Com UNION
, apenas valores distintos são selecionados.
UNION ALL
O UNION ALL
comando é igual ao UNION
comando, exceto que UNION ALL
seleciona todos os valores.
A diferença entre Union
e Union all
é que Union 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 um SELECT DISTINCT
no 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
UNION
e UNION 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, use UNION ALL
se você não tiver certeza de qual usar.
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'
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:
UNION
/ UNION ALL
).
union
combinação de join
s 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 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.
()
mostrada uma segunda vez. Na verdade, pensando bem, porque o union 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]
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.
UNION
levará muito tempo se uma linha duplicada encontrar como DISTINCT
for 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
DISTINCT
sobre os resultados é uma operação de classificação nos resultados.
UNION ALL
os resultados serão mostrados como ordem arbitrária nos resultados, mas os UNION
resultados 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.
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;
UNION
mescla o conteúdo de duas tabelas estruturalmente compatíveis em uma única tabela combinada.
A diferença entre UNION
e UNION ALL
é que UNION will
omitem registros duplicados e que UNION ALL
incluem registros duplicados.
Union
O conjunto de resultados é classificado em ordem crescente, enquanto o UNION ALL
conjunto de resultados não é classificado
UNION
executa um DISTINCT
em seu conjunto de resultados para eliminar quaisquer linhas duplicadas. Considerando UNION ALL
que não removerá duplicatas e, portanto, é mais rápido que UNION
. *
Nota : O desempenho de UNION ALL
normalmente será melhor do que UNION
, uma vez que UNION
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 de UNION ALL
seria recomendado por razões de desempenho.
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
Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))
Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)
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 isso
SELECT * FROM Student
UNION
SELECT * FROM Teacher
o 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 isso
SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher
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
UNION
para 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.
Em palavras muito simples, a diferença entre UNION e UNION ALL é que UNION omitirá registros duplicados, enquanto UNION ALL incluirá registros duplicados.
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.
UNION
irá 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 union
que aparece classificado com 100 linhas pode não estar com 100.000 linhas
ORDER 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.
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! 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!
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.
Se não houver ORDER BY
, a UNION ALL
poderá retornar as linhas conforme necessário, enquanto a UNION
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 - a UNION 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.
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.
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.
UNION ALL
també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 all
não.
A única diferença é:
"UNION" remove linhas duplicadas.
"UNION ALL" não remove linhas duplicadas.