0Pricing
SQL Interview Prep · Aula

UNION versus UNION ALL

Entenda a diferença de eliminação de duplicatas e desempenho e por que UNION ALL costuma ser o desejado.

UNION versus UNION ALL é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

Por que os entrevistadores perguntam sobre UNION

As operações de conjuntos empilham um conjunto de resultados sobre outro, verticalmente. UNION e UNION ALL são os primeiros operadores de conjuntos aos quais os entrevistadores recorrem, porque a diferença entre eles é uma resposta de uma linha que revela se você entende o custo.

A pergunta quase sempre é formulada assim: “Qual é a diferença entre UNION e UNION ALL e qual você deve usar?” Uma resposta forte menciona a remoção de duplicatas, a ordenação e o desempenho de uma só vez.

O que UNION faz

UNION combina as linhas de duas consultas em um único conjunto de resultados e depois remove as linhas duplicadas. Duas linhas só são duplicadas se todas as colunas forem iguais.

Para remover duplicatas, o mecanismo precisa ordenar ou usar uma tabela de dispersão para todas as linhas combinadas, o que exige trabalho real. UNION retorna um conjunto no sentido matemático: sem repetições.

SELECT city FROM customers
UNION
SELECT city FROM suppliers;

O que UNION ALL faz

UNION ALL concatena os dois conjuntos de resultados e mantém todas as linhas, inclusive as duplicadas. Não faz remoção de duplicatas, portanto não ordena nem usa dispersão para essa finalidade.

Como ignora a etapa de remoção de duplicatas, UNION ALL quase sempre é mais rápido e é a escolha correta quando você sabe que as linhas não podem se sobrepor ou quando as duplicatas são desejadas.

SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;

A diferença de desempenho

Resumo para a entrevista: UNION ALL é mais barato porque nunca remove duplicatas. UNION precisa comparar cada linha combinada com todas as outras para eliminar repetições.

  • UNION = UNION ALL + uma etapa implícita de DISTINCT.
  • Em conjuntos de resultados grandes, esse DISTINCT pode dominar o custo da consulta.

Se você não precisa remover duplicatas, escolher UNION desperdiça CPU e memória.

Exemplo resolvido com duplicatas

Suponha que ambas as consultas possam retornar a linha 'Paris'. Com UNION, você obtém um único Paris. Com UNION ALL, obtém Paris duas vezes.

Os entrevistadores adoram pedir que você preveja a quantidade de linhas. Primeiro, sempre imagine a concatenação bruta e depois pergunte: o operador elimina as repetições?

-- customers.city: Paris, Lyon
-- suppliers.city: Paris, Nice
-- UNION     -> Paris, Lyon, Nice   (3 rows)
-- UNION ALL -> Paris, Lyon, Paris, Nice (4 rows)

As duplicatas são definidas em todas as colunas

Armadilha comum: duas linhas são duplicatas somente se todas as colunas selecionadas forem iguais. Adicione uma coluna diferente e as linhas deixarão de ser duplicatas, portanto UNION manterá ambas.

É por isso que SELECT id, city geralmente retorna mais linhas que SELECT city com UNION, mesmo nas mesmas tabelas.

SELECT id, city FROM customers
UNION
SELECT id, city FROM suppliers;
-- ids differ -> few or no duplicates removed

Ordenando o resultado combinado

Não é possível colocar ORDER BY nos ramos individuais; ele se aplica ao resultado combinado inteiro e deve aparecer uma única vez no final.

Um entrevistador pode perguntar onde fica ORDER BY. A resposta: um único ORDER BY após a última consulta, referindo-se às colunas de saída pelo nome ou pela posição.

SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers
ORDER BY city;

Os nomes das colunas vêm da primeira consulta

Ao referenciar colunas no ORDER BY final, use os nomes (ou nomes alternativos) do primeiro SELECT. Os nomes das colunas da segunda consulta são ignorados na identificação da saída.

Isso é importante quando os ramos dão nomes diferentes às colunas. Renomeie as colunas do primeiro ramo para controlar o cabeçalho da saída.

SELECT city AS location FROM customers
UNION ALL
SELECT town FROM suppliers
ORDER BY location;

Quando UNION é a escolha certa

Use UNION somente quando houver realmente a possibilidade de linhas repetidas e você quiser cada linha distinta uma única vez. Exemplos: combinar duas listas de contatos nas quais a mesma pessoa pode aparecer nas duas, ou criar uma lista sem duplicatas de valores distintos provenientes de várias fontes.

Se você puder garantir que as fontes não têm elementos em comum, UNION ALL produzirá o mesmo resultado com mais rapidez.

SELECT email FROM web_signups
UNION
SELECT email FROM store_signups;
-- one row per distinct email across both

Quando UNION ALL é a escolha certa

Use UNION ALL quando não puderem ocorrer duplicatas, quando as duplicatas forem relevantes ou quando você fizer uma agregação depois. Um padrão clássico é empilhar tabelas de partições mensais que não compartilham linhas.

Dica para entrevistas: diga que UNION ALL é o padrão e que você só recorre a UNION quando a remoção de duplicatas for realmente necessária.

SELECT * FROM sales_2023
UNION ALL
SELECT * FROM sales_2024;

Juntando tudo

Uma resposta bem elaborada em uma entrevista soaria assim: "UNION remove linhas duplicadas, o que exige uma ordenação ou uma tabela de dispersão; UNION ALL mantém tudo e é mais rápido. Ambos exigem a mesma quantidade de colunas e tipos compatíveis, e qualquer ORDER BY aparece uma única vez no final. Eu uso UNION ALL por padrão, a menos que a deduplicação seja necessária."

Essa única frase demonstra, ao mesmo tempo, correção e atenção ao desempenho.

Verificação rápida

Avalie sua compreensão da diferença entre UNION e UNION ALL.

Resumo

Principais conclusões:

  • UNION = combinar + remover linhas duplicadas (DISTINCT implícito, custo adicional).
  • UNION ALL = combinar e manter tudo, mais rápido e padrão sensato.
  • Para haver duplicatas, todas as colunas precisam ser iguais.
  • Um único ORDER BY aparece no final e usa os nomes das colunas da primeira consulta.

Use UNION ALL por padrão; recorra a UNION somente quando a deduplicação for realmente necessária.

Perguntas Frequentes

A aula “UNION versus UNION ALL” é grátis?

Sim — o texto completo de “UNION versus UNION ALL” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.

O que vou aprender em “UNION versus UNION ALL”?

Entenda a diferença de eliminação de duplicatas e desempenho e por que UNION ALL costuma ser o desejado. Você pratica SQL Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Interview Prep?

Nenhuma experiência prévia é necessária. SQL Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “UNION versus UNION ALL”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Interview Prep?

Sim. Cada aula de SQL Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. UNION versus UNION ALL
  2. Compatibilidade de quantidade e tipos de colunas
  3. INTERSECT e EXCEPT para comparação
  4. Emulando operações de conjuntos com junções
← Voltar para SQL Interview Prep