← Voltar para os artigos

UNION, UNION ALL e FULL JOIN: empilhar linha não é acoplar coluna

Por Fernando Nagao Douverny · 24 de julho de 2026 · 2 min de leitura

intermediárioarmadilhas

Você tem pedidos do site numa tabela e pedidos do app em outra. Quer os dois juntos.

Aí bate a dúvida: isso é UNION ou é JOIN? A resposta fica óbvia quando você para de pensar em “juntar” e pensa em qual direção está juntando.

A direção decide

  • Empilhar linhas — a mesma informação, vinda de origens diferentes. Cresce para baixo. Isso é UNION.
  • Acoplar colunas — informações diferentes sobre a mesma entidade. Cresce para o lado. Isso é JOIN.

Pedido do site e pedido do app são a mesma coisa em dois lugares: empilha.

SELECT id, valor, 'site' AS canal FROM fat_pedido_site
UNION ALL
SELECT id, valor, 'app'  AS canal FROM fat_pedido_app

Pedido e pagamento são coisas diferentes ligadas por uma chave: acopla. Aí é JOIN.

O preço escondido do UNION

UNION e UNION ALL não fazem a mesma coisa:

  • UNION ALL empilha e pronto.
  • UNION empilha e remove duplicatas.

Remover duplicata não é de graça: o banco precisa comparar todas as linhas entre si para descobrir quais se repetem. Em tabela grande, isso pode ser a parte mais lenta da query — para um trabalho que, na maioria dos casos, era desnecessário.

Se as origens não têm sobreposição — e site e app não têm —, UNION ALL dá o mesmo resultado sem pagar essa conta.

Pior: o UNION pode apagar linha legítima. Dois pedidos diferentes com o mesmo valor, no mesmo dia, viram um só. O número do relatório baixa e ninguém erra query nenhuma.

Onde o FULL JOIN entra

FULL JOIN é JOIN — cresce para o lado. Ele mantém os dois lados mesmo sem par, mas continua casando por chave e colocando as colunas lado a lado.

Serve para comparação: “o que tem no sistema A que não tem no B, e vice-versa”. Não serve para empilhar duas tabelas de mesma natureza.

Pra lembrar

Pergunte o que precisa crescer:

  • Precisa de mais linhas → UNION ALL (e só use UNION se realmente puder haver repetição)
  • Precisa de mais colunas → JOIN, e FULL JOIN quando não pode perder nenhum dos lados

UNION é o default errado. O default é UNION ALL; tirar duplicata é uma decisão consciente, não um detalhe de digitação.