Programa
As operações de conjunto são a base do SQL e permitem combinar, comparar e filtrar dados de várias fontes. Elas são indispensáveis para tarefas que vão de integração e limpeza de dados até análises avançadas e criação de relatórios.
Neste tutorial, você vai entender o que são operadores de conjunto, como usá-los em SQL, aplicações práticas e muito mais! Se você busca um conteúdo completo para aprender SQL, confira esta trilha de habilidades com sete cursos: SQL Fundamentals.
Se você está com pressa, vamos começar com uma resposta bem curta sobre o que são operações de conjunto em SQL.
Obtenha uma das melhores certificações em SQL
O que são operações de conjunto em SQL?
Operações de conjunto em SQL são técnicas para combinar ou comparar os resultados de dois ou mais comandos SELECT. Elas funcionam como operações de conjuntos na matemática, permitindo encontrar a união, a interseção ou a diferença entre as linhas retornadas pelas consultas. Isso as torna essenciais ao analisar dados de múltiplas fontes ou perspectivas.
Aqui vai um panorama rápido das operações principais:
-
UNION: mescla todas as linhas únicas de dois ou maisSELECT, eliminando duplicatas. -
UNION ALL: mescla todas as linhas de dois ou maisSELECT, mantendo duplicatas. -
INTERSECT: retorna apenas as linhas que aparecem em ambos osSELECT. -
EXCEPT: retorna as linhas do primeiroSELECTque não aparecem no segundo.
Comparação com operações da álgebra relacional
A álgebra relacional é um arcabouço teórico que fundamenta o entendimento de consultas a bancos de dados. Ela oferece operações abstratas como projeção, seleção e junção, enraizadas em princípios matemáticos e independentes de sistemas específicos. Pense nela como a lógica "por trás das cortinas" que sustenta nossas interações com bancos de dados.
Os operadores de conjunto no SQL são a implementação prática desses conceitos no ambiente de banco de dados. Eles permitem realizar união, interseção e diferença diretamente sobre os conjuntos de resultados de consultas SQL.
Enquanto a álgebra relacional fornece a base formal das operações, os operadores de conjunto em SQL oferecem uma interface padronizada e amigável para manipulação de dados.
Entender a relação entre operadores de conjunto e operações da álgebra relacional dá clareza sobre os fundamentos teóricos do SQL. Conhecer esse vínculo ajuda você a escrever consultas com um modelo mental mais nítido do que acontece nos bastidores.
Tipos de operadores de conjunto em SQL
Existem três operadores de conjunto principais em SQL:
-
UNION -
INTERSECT -
EXCEPT(ouMINUSem alguns dialetos)
Esses operadores correspondem matematicamente a união, interseção e diferença de conjuntos.
Regras para usar operadores de conjunto
Antes de combinar consultas com operadores de conjunto, quatro requisitos precisam ser atendidos. Se algum deles falhar, sua consulta vai retornar erro.
-
Mesmo número de colunas: cada
SELECTdeve retornar a mesma quantidade de colunas. Se uma consulta retorna três e outra retorna duas, o banco gera erro. -
Tipos de dados compatíveis: as colunas correspondentes precisam ter tipos compatíveis. Você não pode combinar, na mesma posição, uma coluna
VARCHARde nome com umINTEGERde ID. -
Mesma ordem das colunas: o SQL mapeia colunas por posição, não por nome. A primeira coluna da primeira consulta casa com a primeira da segunda, independentemente do nome.
-
ORDER BYapenas no final: oORDER BYdeve aparecer uma única vez, no fim da consulta combinada. Não dá para usá-lo dentro de cadaSELECTindividual.
Mais um detalhe: os nomes das colunas no resultado vêm do primeiro SELECT. Aliases nas consultas seguintes são ignorados, então adicione aliases apenas na primeira consulta se quiser nomes de saída personalizados.
Como usar o operador UNION em SQL
O operador UNION combina os resultados de duas ou mais consultas SELECT em um único conjunto de resultados, removendo linhas duplicadas por padrão.
Por exemplo, suponha que temos duas tabelas, employees e contractors, cada uma com colunas semelhantes como name, department e salary. Para fins de aprendizado, vamos considerar estas duas tabelas fictícias:
employees:
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
Carol |
Engineering |
80000 |
|
John |
HR |
55000 |
contractors:
|
name |
department |
salary |
|
David |
Marketing |
60000 |
|
Eva |
Sales |
68000 |
|
Carol |
Engineering |
75000 |
Podemos combinar os resultados de ambas as tabelas com o seguinte comando:
-- Usando UNION para combinar todos os employees e contractors
SELECT name, department, salary FROM employees
UNION
SELECT name, department, salary FROM contractors;
Essa consulta seleciona as colunas name, department e salary das tabelas employees e contractors e as combina em um único conjunto de resultados. O operador UNION remove automaticamente linhas duplicadas do resultado final.
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
Carol |
Engineering |
80000 |
|
John |
HR |
55000 |
|
David |
Marketing |
60000 |
|
Eva |
Sales |
68000 |
Repare que a Carol, que aparece nas duas tabelas, é listada apenas uma vez no resultado. Se quisermos manter as duas ocorrências da Carol (com salários diferentes), devemos usar UNION ALL.
UNION vs UNION ALL
O operador UNION não remove valores NULL. Se uma coluna contém NULL em um conjunto de resultados e valores não NULL na coluna correspondente do outro conjunto, os NULL serão mantidos no resultado final produzido por UNION.
Se quisermos incluir valores NULL no conjunto de resultados e evitar sua remoção pelo UNION, podemos usar UNION ALL. Esse operador combina os resultados de múltiplos SELECT, incluindo todas as linhas de cada conjunto, independentemente de serem duplicadas ou conterem NULL.
Como usar o operador INTERSECT em SQL
O INTERSECT retorna apenas as linhas que aparecem em ambos os conjuntos de resultados. Pense nele como encontrar as pessoas que pertencem aos dois grupos.
Vamos usar INTERSECT nas tabelas acima. Para simplificar, vamos consultar apenas as colunas de nome e departamento:
-- Usando INTERSECT para encontrar funcionários em comum
SELECT name, department FROM employees
INTERSECT
SELECT name, department FROM contractors;
Essa consulta seleciona as colunas name e department das tabelas employees e contractors e retorna somente as linhas que existem em ambas as tabelas considerando todas as colunas selecionadas.
|
name |
department |
|
Carol |
Engineering |
O INTERSECT lida com valores NULL segundo as regras padrão de comparação, considerando NULL iguais ao comparar colunas correspondentes. Ele também resulta em conjunto vazio ao lidar com conjuntos de resultados vazios.
Em outras palavras, se um NULL estiver presente em um conjunto e a coluna correspondente no outro conjunto tiver um valor não NULL, as linhas não são consideradas iguais – e não serão incluídas na interseção.
Além disso, se um dos conjuntos passados ao INTERSECT estiver vazio, o resultado geral também será vazio. Não há linhas em comum entre um conjunto vazio e qualquer outro.
Como usar o operador EXCEPT em SQL
O EXCEPT retorna as linhas do primeiro conjunto de resultados que não estão no segundo.
No Oracle Database, EXCEPT é escrito como MINUS; nos demais grandes dialetos (PostgreSQL, SQL Server, MySQL 8.0.31+, SQLite) usa-se EXCEPT.
Por exemplo, vamos executar a consulta a seguir:
-- Usando EXCEPT para encontrar employees que não são contractors
SELECT name, department, salary FROM employees
EXCEPT
SELECT name, department, salary FROM contractors;
As colunas name, department e salary são selecionadas da tabela employees e retornam apenas as linhas que não existem na tabela contractors.
|
name |
department |
salary |
|
Alice |
Marketing |
65000 |
|
Bob |
Sales |
70000 |
|
John |
HR |
55000 |
O EXCEPT também segue as regras padrão para lidar com valores NULL. Quanto a conjuntos vazios, o resultado é vazio se o primeiro conjunto estiver vazio; se o segundo estiver vazio, o resultado inclui todas as linhas do primeiro conjunto.
Operadores de conjunto em SQL: performance e otimização
O impacto dos operadores de conjunto no desempenho das consultas pode variar conforme o tamanho dos dados envolvidos, a complexidade das consultas e o sistema de gerenciamento de banco de dados (SGBD) utilizado.
Vamos detalhar os principais fatores e estratégias de otimização.
Volume de dados e complexidade da consulta
Ao trabalhar com grandes volumes, operadores de conjunto podem impactar bastante a performance, porque o tamanho dos resultados a serem combinados, intersectados ou comparados aumenta o tempo de processamento necessário.
Consultas complexas, com múltiplas subconsultas, joins ou operadores de conjunto, podem gerar sobrecarga adicional e afetar a performance. Operações encadeadas ou aninhadas tendem a agravar esse efeito.
Indexação e técnicas de otimização
Indexar corretamente as colunas envolvidas nas operações de conjunto pode melhorar significativamente a performance. Índices ajudam o mecanismo do banco a localizar e recuperar linhas relevantes mais rápido, reduzindo varreduras completas de tabela e acelerando a execução.
Para melhorar consultas com operadores de conjunto, administradores e desenvolvedores podem aplicar reescrita de consultas, análise de planos de execução e otimização de schema. Técnicas como cache de consultas e views materializadas também podem pré-computar e armazenar resultados de consultas complexas, reduzindo o custo computacional.
Mecanismo do banco e recursos de hardware
A performance das operações de conjunto varia conforme o mecanismo do banco e suas capacidades de otimização. Diferentes SGBDs adotam estratégias e algoritmos distintos, o que pode gerar variações de desempenho.
A disponibilidade de recursos de hardware, como CPU, memória e I/O de disco, também influencia o desempenho de consultas com operadores de conjunto. Recursos adequados ajudam a mitigar gargalos e garantem uma execução eficiente.
Operadores de conjunto na prática
Os operadores de conjunto não são apenas conceitos teóricos; eles têm usos reais que podem influenciar decisões de negócio. Vamos ver um exemplo simplificado de como uma empresa pode usar esses operadores para segmentar sua base de clientes em campanhas de marketing direcionadas.
O cenário
Imagine uma empresa que vende online e em lojas físicas. Ela possui dois conjuntos de dados separados:
- Compras online: ID do cliente, histórico de compras, dados demográficos e localização dos clientes online.
- Transações em loja: informações semelhantes para clientes que compraram presencialmente.
Usando operadores de conjunto
Para ter uma visão completa de todos os clientes, a empresa usaria UNION para combinar os dois conjuntos em uma única tabela, removendo duplicatas. Assim, obtém uma visão unificada de toda a base.
Em seguida, poderia usar INTERSECT para identificar clientes que compraram online e na loja. Esse segmento é especialmente valioso por ter alto engajamento com a marca em vários canais.
Para encontrar oportunidades de promoção cruzada, a empresa poderia usar EXCEPT. Por exemplo, SELECT * FROM online_purchases EXCEPT SELECT * FROM in_store_transactions encontra clientes que compraram apenas online, mas não na loja. Depois, é possível direcionar esses clientes com ações que incentivem a visita a uma unidade física.
Além da segmentação
Com esses segmentos definidos, a empresa pode ir além, refinando-os por fatores como demografia ou histórico de compras. Esse entendimento mais granular permite personalizar campanhas com muito mais precisão.
Operadores de conjunto vs. JOINs
Tanto os operadores de conjunto quanto os JOINs em SQL combinam dados de múltiplas consultas, mas funcionam de forma diferente. A pergunta central é se você quer combinar linhas ou colunas.
| Recurso | Operadores de conjunto | JOINs |
|---|---|---|
| Combina | Linhas (empilha consultas verticalmente) | Colunas (alarga as linhas horizontalmente) |
| Requer | Mesma contagem de colunas e tipos de dados compatíveis | Uma coluna-chave compartilhada entre as tabelas |
| Use quando | For para mesclar conjuntos semelhantes, encontrar sobreposições ou diferenças entre resultados | For para enriquecer uma linha com dados relacionados de outra tabela |
| Tratamento de duplicatas | UNION remove duplicatas; UNION ALL as mantém |
Depende do tipo de join e dos dados |
| Tipos | UNION, UNION ALL, INTERSECT, EXCEPT/MINUS |
INNER, LEFT, RIGHT, FULL OUTER, CROSS |
Limitações e considerações dos operadores de conjunto
Ao usar operadores de conjunto em SQL, é essencial considerar limitações e fatores que podem afetar performance, precisão dos resultados e usabilidade.
Compatibilidade de tipos e valores NULL
As colunas correspondentes nos resultados precisam ter tipos de dados compatíveis. Verifique a compatibilidade antes de combinar consultas. Incompatibilidades geram erros fáceis de passar despercebidos.
Operadores de conjunto podem tratar NULL de forma diferente dependendo do SGBD e do operador específico. Para evitar surpresas, é importante entender como NULL é tratado.
Impacto na performance e linhas duplicadas
Operações de conjunto podem impactar bastante a performance, especialmente em conjuntos grandes ou complexos. Fatores como indexação, otimização de consultas e recursos de hardware influenciam o desempenho. Técnicas de otimização e ajustes finos são essenciais para mitigar gargalos.
Por padrão, operadores de conjunto removem linhas duplicadas do resultado. Porém, em alguns casos pode ser necessário mantê-las. É importante entender o comportamento em relação a duplicatas e aplicar as técnicas adequadas quando preciso.
Ordenação dos resultados e restrições de memória
Operadores de conjunto não garantem a ordem do resultado final. Para ordenar o conjunto combinado, adicione uma cláusula ORDER BY no fim de toda a consulta, após o último SELECT.
Essas operações podem consumir bastante memória e recursos, principalmente com grandes volumes. É preciso considerar limitações de memória e recursos para evitar degradação de performance ou instabilidade.
Complexidade, manutenção e compatibilidade entre SGBDs
Consultas complexas com múltiplos operadores de conjunto, subconsultas e joins podem ser difíceis de entender, manter e depurar. Para melhorar legibilidade e manutenção, mantenha consultas concisas, bem documentadas e modulares.
Operadores de conjunto podem variar em sintaxe e comportamento entre diferentes sistemas. Conhecer essas diferenças é vital ao escrever SQL com compatibilidade entre plataformas.
Considerações finais
Operadores de conjunto resolvem um problema específico: combinar ou comparar conjuntos de resultados sem saber de antemão quais linhas se sobrepõem.
Eles abrangem UNION, INTERSECT e EXCEPT: os três operadores para combinar, comparar e subtrair conjuntos de resultados.
Para se aprofundar, confira o curso Joining Data in SQL.
Perguntas frequentes sobre operadores de SQL
Qual é a diferença entre UNION ALL e UNION?
UNION ALL inclui todas as linhas de ambas as consultas, mesmo que sejam duplicadas. UNION elimina as duplicatas.
Como o UNION é diferente de JOIN em SQL?
UNION combina resultados verticalmente, anexando linhas de uma consulta à outra. JOIN combina tabelas horizontalmente, casando linhas com base em uma coluna relacionada e criando um resultado mais largo.
Há considerações de performance ao usar operações de conjunto?
Operações de conjunto podem ser custosas computacionalmente, principalmente com grandes volumes de dados. É importante otimizar as consultas individuais e usar índices sempre que possível para melhorar a performance.
Qual é a diferença entre EXCEPT e NOT IN?
EXCEPT e NOT IN podem produzir resultados semelhantes, mas se comportam de forma diferente com valores NULL. EXCEPT trata NULL como iguais ao comparar linhas, então dois NULL na mesma posição de coluna farão a linha ser excluída. Já NOT IN não retorna nenhuma linha se a subconsulta contiver qualquer NULL, porque comparações com NULL são indefinidas em SQL. Em grandes conjuntos, EXCEPT também pode ser mais legível do que uma subconsulta correlacionada com NOT IN.
Posso usar ORDER BY com operadores de conjunto?
Sim, mas apenas uma vez, no fim de toda a consulta. Você não pode usar ORDER BY dentro de SELECT individuais em uma operação de conjunto. Para ordenar o resultado combinado, adicione uma única cláusula ORDER BY após o último SELECT.
Exemplo:
SELECT name FROM employees
UNION
SELECT name FROM contractors
ORDER BY name ASC;O MySQL suporta INTERSECT e EXCEPT?
O MySQL adicionou suporte a INTERSECT e EXCEPT na versão 8.0.31. Se você usa uma versão mais antiga, será preciso emulá-los: use um INNER JOIN ou subconsulta com IN para replicar INTERSECT, e um LEFT JOIN ... WHERE IS NULL ou subconsulta NOT IN para replicar EXCEPT. No Oracle, usa-se MINUS em vez de EXCEPT.

