UNION, INTERSECT, EXCEPT
Operações de conjunto e comportamento de deduplicação. Padrões práticos de PostgreSQL para consultas de produção.
Receita
SELECT email FROM app.customers
UNION
SELECT contact_email FROM app.suppliers;
SELECT email FROM app.customers
INTERSECT
SELECT email FROM app.newsletter_subscribers;
SELECT email FROM app.customers
EXCEPT
SELECT email FROM app.unsubscribed;Quando usar isso: Este padrão aparece em SQL de aplicação ou de relatórios que você mantém.
Exemplo Prático
SELECT email, 'customer' AS source FROM app.customers
UNION ALL
SELECT contact_email, 'supplier' FROM app.suppliers;O que isso demonstra:
- UNION remove duplicatas (custo de ordenação/hash para deduplicação)
- UNION ALL mantém duplicatas, mais rápido
- INTERSECT e EXCEPT comparam linhas inteiras
Mergulho Profundo
Compatibilidade
- Contagens e tipos de colunas devem se alinhar; casts podem ser necessários.
- ORDER BY se aplica ao resultado final; use parênteses externos.
- UNION ALL é preferível quando duplicatas são impossíveis ou aceitáveis.
Armadilhas
- SELECT * em aplicações - Novas colunas quebram serializadores. Correção: Liste as colunas explicitamente.
- Comparações de NULL - = NULL é sempre desconhecido. Correção: Use IS NULL ou IS DISTINCT FROM.
- Casts implícitos - Scans sequenciais surpreendentes em tipos incompatíveis. Correção: Combine os tipos do predicado com os tipos das colunas.
- Consultas ilimitadas - Falta LIMIT em tabelas grandes. Correção: Paginar ou agregar intencionalmente.
- Estatísticas desatualizadas - Planos ruins após carga em massa. Correção: Execute ANALYZE nas tabelas afetadas.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| ORM query builder | A equipe padroniza em uma única stack | SQL complexo se torna opaco |
| Materialized view | Repetir agregações caras | Necessita de estratégia de atualização |
| Cópia do Warehouse | Scans pesados de BI | Não para latência OLTP |
FAQs
Devo formatar SQL em strings de aplicação?
Use strings de template multilinhas ou arquivos SQL; faça lint no CI.
Quando DISTINCT é suficiente?
Quando você precisa de linhas únicas sem agregações.
ORDER BY prejudica índices?
A ordenação pode usar a ordem do índice se a consulta corresponder às colunas do índice.
Relacionado
- Noções Básicas de Consultas SQL - projeções
- Common Table Expressions - pipelines legíveis
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, e PostGIS 3.5+.