Operações com Conjuntos
Operações com Conjuntos
🌍 Analogia do Mundo Real
Imagine que você tem duas pilhas de cartões de visita:
- UNION — Combina as duas pilhas, mantendo apenas uma cópia dos duplicados
- UNION ALL — Combina todos os cartões de ambas as pilhas, mantendo os duplicados
- INTERSECT — Seleciona apenas aqueles que aparecem em ambas as pilhas
- EXCEPT — Remove da primeira pilha qualquer pessoa que também apareça na segunda
Operações com conjuntos realizam operações de "mesclar, intersectar e diferenciar" em dois conjuntos de resultados de consultas.
🎯 Conceitos Fundamentais
UNION — Mesclagem com Deduplicação
Mescla dois conjuntos de resultados, removendo automaticamente linhas duplicadas.
SELECT city FROM employees
UNION
SELECT city FROM departments;
UNION ALL — Mesclagem sem Deduplicação
Mescla dois conjuntos de resultados, mantendo todas as linhas duplicadas. Melhor desempenho porque não é necessária deduplicação.
SELECT city FROM employees
UNION ALL
SELECT city FROM departments;
INTERSECT — Interseção
Retorna linhas que existem em ambos os conjuntos de resultados.
SELECT city FROM employees
INTERSECT
SELECT city FROM departments;
EXCEPT / MINUS — Diferença
Retorna linhas que existem no primeiro conjunto de resultados mas não existem no segundo.
-- EXCEPT (SQL Server, PostgreSQL)
SELECT city FROM employees
EXCEPT
SELECT city FROM departments;
-- MINUS (Oracle)
SELECT city FROM employees
MINUS
SELECT city FROM departments;
Regras de Correspondência de Colunas
Ao usar operações com conjuntos, as duas instruções SELECT devem satisfazer:
| Regra | Descrição |
|---|---|
| Mesma contagem de colunas | Ambos os SELECTs devem ter o mesmo número de colunas |
| Tipos compatíveis | As colunas correspondentes devem ter tipos de dados compatíveis |
| ORDER BY no final | Só pode ser usado uma vez no final da instrução |
-- Correto: duas colunas, tipos correspondem
SELECT first_name, salary FROM employees
UNION
SELECT department_name, budget FROM departments;
-- Errado: contagem de colunas diferente
SELECT first_name, salary FROM employees
UNION
SELECT department_name; -- ❌ Contagem de colunas incompatível
💡 Quando Usar Qual Operação
| Operação | Cenário | Deduplicação | Desempenho |
|---|---|---|---|
| UNION | Precisa mesclar e deduplicar | ✅ Sim | Mais lento |
| UNION ALL | Mesclar sem deduplicação | ❌ Não | Mais rápido |
| INTERSECT | Encontrar partes comuns | ✅ Sim | Médio |
| EXCEPT | Encontrar diferenças | ✅ Sim | Médio |
UNION ALL para melhor desempenho.
📝 Sintaxe Básica
-- Sintaxe UNION
SELECT coluna1, coluna2 FROM tabela1
UNION
SELECT coluna1, coluna2 FROM tabela2
[ORDER BY coluna1];
-- Sintaxe UNION ALL
SELECT coluna1, coluna2 FROM tabela1
UNION ALL
SELECT coluna1, coluna2 FROM tabela2;
-- Sintaxe INTERSECT
SELECT coluna1, coluna2 FROM tabela1
INTERSECT
SELECT coluna1, coluna2 FROM tabela2;
-- Sintaxe EXCEPT
SELECT coluna1, coluna2 FROM tabela1
EXCEPT
SELECT coluna1, coluna2 FROM tabela2;
- Em operações com conjuntos, os nomes das colunas são determinados pelo primeiro SELECT
- ORDER BY só pode aparecer no final e tipicamente usa números ordinais de colunas
- Cada SELECT pode ter seu próprio WHERE, GROUP BY
📌 Exemplos
Exemplo: Consultar Todas as Fontes de Nomes
Mesclar nomes de funcionários e nomes de departamentos em um único conjunto de resultados.
-- Visualizar todas as fontes de "nomes": funcionários + gerentes de departamento
SELECT first_name AS name, 'Funcionário' AS origem
FROM employees
UNION ALL
SELECT department_name, 'Departamento'
FROM departments
ORDER BY origem;
Explicação: Uma coluna constante é adicionada para marcar a fonte dos dados para fácil distinção.
Exemplo: Encontrar Cidades com Funcionários mas Sem Departamentos
-- Cidades com funcionários menos cidades com departamentos
SELECT city FROM employees
EXCEPT
SELECT city FROM departments;
Abordagem: Use EXCEPT como uma operação de diferença para encontrar rapidamente "cidades que aparecem apenas em funcionários".
🎬 Cenários Práticos
Cenário 1: Mesclar Listas de Clientes de Múltiplos Canais
A empresa tem tabelas de clientes online e offline que precisam ser mescladas e deduplicadas para criar um diretório completo de clientes.
-- Clientes online
SELECT customer_name, email, 'Online' AS canal
FROM online_customers
UNION
-- Clientes offline
SELECT customer_name, email, 'Offline'
FROM offline_customers
ORDER BY customer_name;
Ponto-chave: Use UNION em vez de UNION ALL para remover automaticamente clientes duplicados.
Cenário 2: Comparar Diferenças de Vendas Entre Dois Meses
Encontrar produtos que tiveram vendas neste mês, mas não no mês passado.
-- Produtos vendidos este mês
SELECT product_id FROM orders
WHERE order_date >= '2026-06-01'
EXCEPT
-- Produtos vendidos mês passado
SELECT product_id FROM orders
WHERE order_date >= '2026-05-01'
AND order_date < '2026-06-01';
Ponto-chave: EXCEPT é naturalmente adequado para cenários de "encontrar diferenças".
❓ Perguntas Frequentes
P: Quando devo usar UNION vs UNION ALL? R: Se você não precisa de deduplicação, prefira
UNION ALLporque não requer uma etapa extra de deduplicação e tem melhor desempenho. UseUNIONapenas quando especificamente precisar de deduplicação.
P: Nomes de colunas incompatíveis em operações com conjuntos causarão erros? R: Não, os nomes das colunas do conjunto de resultados são determinados pelo primeiro
SELECT. Porém, a contagem de colunas e os tipos de dados das colunas correspondentes devem coincidir.
P: Qual é a diferença entre INTERSECT e JOIN? R:
INTERSECTcorresponde a linhas inteiras para interseção, enquantoJOINassocia tabelas com base em condições especificadas. UseINTERSECTquando precisar "encontrar linhas idênticas", e useJOINquando precisar "associar colunas de tabelas diferentes por um campo".
P: O MySQL suporta INTERSECT e EXCEPT? R: MySQL 8.0 e posteriores suportam
INTERSECTeEXCEPT. Para versões anteriores, você precisa simulá-los usandoINNER JOINeNOT EXISTS/LEFT JOIN ... IS NULL.
📖 Resumo
| Operação | Propósito | Deduplicação |
|---|---|---|
| UNION | Mesclar dois conjuntos de resultados | ✅ |
| UNION ALL | Mesclar dois conjuntos de resultados (manter duplicatas) | ❌ |
| INTERSECT | Interseção de dois conjuntos de resultados | ✅ |
| EXCEPT | Diferença de dois conjuntos de resultados | ✅ |
- Contagem e tipos de colunas devem coincidir
ORDER BYsó pode ser posicionado no final da instrução- Prefira
UNION ALLquando tiver certeza de que não há duplicatas para melhor desempenho
📝 Exercícios
- Use
UNIONpara mesclar funcionários com salário acima de 8000 da tabelaemployeese nomes de departamentos com orçamento acima de 100000 da tabeladepartments. - Use
INTERSECTpara encontrar cidades que existem em ambas as tabelasemployeesedepartments. - Use
EXCEPTpara encontrar cidades que possuem departamentos mas não têm funcionários atribuídos. - Pense sobre: O que acontece se os tipos de coluna de dois resultados de consulta não corresponderem completamente (por exemplo, INT e VARCHAR) em uma operação com conjuntos?
Próxima Lição
A seguir aprenderemos Restrições e Chaves — entenda como usar PRIMARY KEY, FOREIGN KEY e outras restrições para garantir a integridade dos dados.



