UNION, UNION ALL e FULL JOIN: empilhar linha não é acoplar coluna
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 ALLempilha e pronto.UNIONempilha 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ó useUNIONse realmente puder haver repetição) - Precisa de mais colunas →
JOIN, eFULL JOINquando 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.