Operações com Conjuntos

Operações com Conjuntos

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


🎯 Conceitos Fundamentais

UNION — Mesclagem com Deduplicação

Mescla dois conjuntos de resultados, removendo automaticamente linhas duplicadas.

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

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

INTERSECT — Interseção

Retorna linhas que existem em ambos os conjuntos de resultados.

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

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;

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

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


📝 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

📌 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".


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

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.

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?

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%