SQL: Operações com Conjuntos

Última atualização: 2026-10-09

1. 🌍 Analogia do Mundo Real

Imagine que você tem duas pilhas de cartões de visita:

Operações com conjuntos realizam operações de "mesclar, intersectar e diferenciar" em dois conjuntos de resultados de consultas.


2. 🎯 Conceitos Fundamentais

(1) UNION — Mesclagem com Deduplicação

Mescla dois conjuntos de resultados, removendo automaticamente linhas duplicadas.

SQL
SELECT city FROM employees
UNION
SELECT city FROM departments;

(2) 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.

SQL
SELECT city FROM employees
UNION ALL
SELECT city FROM departments;

(3) INTERSECT — Interseção

Retorna linhas que existem em ambos os conjuntos de resultados.

SQL
SELECT city FROM employees
INTERSECT
SELECT city FROM departments;

(4) EXCEPT / MINUS — Diferença

Retorna linhas que existem no primeiro conjunto de resultados mas não existem no segundo.

SQL
-- EXCEPT (SQL Server, PostgreSQL)
SELECT city FROM employees
EXCEPT
SELECT city FROM departments;

-- MINUS (Oracle)
SELECT city FROM employees
MINUS
SELECT city FROM departments;

(5) 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
SQL
-- 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

(6) 💡 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
💡 Regra prática: Se você tem certeza de que não há duplicatas, prefira UNION ALL para melhor desempenho.


3. 📝 Sintaxe Básica

SQL
-- 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;
💡 Dica:

  • 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

4. 📌 Exemplos

▶ Exemplo: Consultar Todas as Fontes de Nomes

Mesclar nomes de funcionários e nomes de departamentos em um único conjunto de resultados.

SQL
-- 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;
▶ Experimente

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

SQL
-- Cidades com funcionários menos cidades com departamentos
SELECT city FROM employees
EXCEPT
SELECT city FROM departments;
▶ Experimente

Abordagem: Use EXCEPT como uma operação de diferença para encontrar rapidamente "cidades que aparecem apenas em funcionários".


5. 🎬 Cenários Práticos

(1) 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.

SQL
-- 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.

(2) 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.

SQL
-- 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 ALL porque não requer uma etapa extra de deduplicação e tem melhor desempenho. Use UNION apenas 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 INTERSECT corresponde a linhas inteiras para interseção, enquanto JOIN associa tabelas com base em condições especificadas. Use INTERSECT quando precisar "encontrar linhas idênticas", e use JOIN quando precisar "associar colunas de tabelas diferentes por um campo".
P O MySQL suporta INTERSECT e EXCEPT?
R MySQL 8.0 e posteriores suportam INTERSECT e EXCEPT. Para versões anteriores, você precisa simulá-los usando INNER JOIN e NOT 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 ✅

📝 Exercícios

  1. Use UNION para mesclar funcionários com salário acima de 8000 da tabela employees e nomes de departamentos com orçamento acima de 100000 da tabela departments.
  2. Use INTERSECT para encontrar cidades que existem em ambas as tabelas employees e departments.
  3. Use EXCEPT para encontrar cidades que possuem departamentos mas não têm funcionários atribuídos.
  4. 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?

6. 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.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%