Ramos da InformáticaBanco de DadosComo Encontrar e Remover Duplicatas no SQL

Como Encontrar e Remover Duplicatas no SQL

Como Encontrar e Remover Valores Duplicados no SQL: Técnicas Básicas e Avançadas para Otimizar seu Banco de Dados

-

Detectar valores duplicados em tabelas SQL é uma tarefa comum no gerenciamento de banco de dados, mas que pode ser abordada de diversas maneiras, dependendo da complexidade da situação. Este artigo explorará não apenas as abordagens básicas, mas também hacks avançados para lidar com cenários complexos.


1. Conceito de Duplicidade

Duplicidade ocorre quando registros em uma ou mais colunas apresentam valores idênticos. Em SQL, usamos agrupamentos e funções de agregação para identificar esses valores. O exemplo mais básico seria encontrar duplicados em uma tabela com base em uma única coluna.


2. Encontrando Duplicados: O Básico

Vamos começar com uma abordagem simples, assumindo uma tabela users com a seguinte estrutura:

Dica de Leitura: Agora que você está explorando como lidar com duplicatas em SQL, você pode estar se perguntando como automatizar ou melhorar a eficiência em suas tarefas de desenvolvimento. Para isso, uma ferramenta como o OpenAI Codex pode ser revolucionária. Aprenda a usar o OpenAI Codex com mais eficiência para elevar seu jogo em programação!

id name email
1 Alice [email protected]
2 Bob [email protected]
3 Alice [email protected]

Para identificar valores duplicados na coluna email:

SELECT email, COUNT(*) AS occurrences
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

Resultado:

email occurrences
[email protected] 2

Aqui, usamos GROUP BY para agrupar registros pelo campo email e HAVING COUNT(*) > 1 para filtrar os que ocorrem mais de uma vez.

VAI GOSTAR: SQL: Domine Views Virtuais e Materializadas

3. Identificando Registros Duplicados com IDs

Caso queira identificar os IDs dos registros duplicados, você pode usar uma subquery:

SELECT id, email
FROM users
WHERE email IN (
    SELECT email
    FROM users
    GROUP BY email
    HAVING COUNT(*) > 1
);

Resultado:

id email
1 [email protected]
3 [email protected]

Isso retorna os IDs associados aos valores duplicados.


4. Hacks Avançados

4.1. Lidando com Duplicados em Múltiplas Colunas

Quando a duplicidade precisa ser verificada em várias colunas, você pode usar a concatenação:

SELECT name, email, COUNT(*) AS occurrences
FROM users
GROUP BY name, email
HAVING COUNT(*) > 1;

Se o banco de dados for compatível, você pode usar a função ROW para lidar com múltiplas colunas mais elegantemente:

SELECT name, email, COUNT(*) AS occurrences
FROM users
GROUP BY ROW(name, email)
HAVING COUNT(*) > 1;

4.2. Excluindo Duplicados Manualmente

Depois de identificar os registros duplicados, você pode removê-los usando a cláusula DELETE com uma subquery:

DELETE FROM users
WHERE id NOT IN (
    SELECT MIN(id)
    FROM users
    GROUP BY email
);

Aqui, mantemos apenas o registro com o menor id de cada grupo de duplicados.


4.3. Detectando Duplicados com Janela Analítica

Uma abordagem mais avançada é usar funções de janela para marcar duplicados:

SELECT id, name, email,
       ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS row_num
FROM users;

Resultado:

id name email row_num
1 Alice [email protected] 1
3 Alice [email protected] 2
2 Bob [email protected] 1

Isso atribui números de linha para registros dentro de cada grupo de duplicados. Posteriormente, você pode usar row_num > 1 para identificar e remover duplicados:

DELETE FROM users
WHERE id IN (
    SELECT id
    FROM (
        SELECT id, ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS row_num
        FROM users
    ) AS subquery
    WHERE row_num > 1
);

4.4. Agregando Dados Duplicados

Em vez de remover ou listar duplicados, pode ser útil agregá-los. Por exemplo, combinando os nomes associados a emails duplicados:

SELECT email, STRING_AGG(name, ', ') AS names
FROM users
GROUP BY email
HAVING COUNT(*) > 1;

Resultado:

email names
[email protected] Alice, Alice

A função STRING_AGG (ou equivalente) facilita a criação de uma lista consolidada de valores.


4.5. Monitorando Duplicados com Triggers

Para evitar duplicados futuros, você pode criar um trigger:

CREATE OR REPLACE FUNCTION prevent_duplicates()
RETURNS TRIGGER AS $$
BEGIN
  IF EXISTS (
    SELECT 1
    FROM users
    WHERE email = NEW.email
  ) THEN
    RAISE EXCEPTION 'Duplicate email detected: %', NEW.email;
  END IF;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER prevent_duplicates_trigger
BEFORE INSERT OR UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION prevent_duplicates();

5. Conclusão

Encontrar e gerenciar duplicados em SQL é uma tarefa essencial para manter a integridade dos dados. Usando abordagens básicas e hacks avançados, como funções de janela e triggers, você pode não apenas identificar duplicados, mas também preveni-los e gerenciá-los de forma eficiente. Experimente essas técnicas no seu banco de dados e adapte-as às suas necessidades específicas.

VAI GOSTAR: Técnicas Avançadas para Otimização de Performance no MySQL

Referências para estudo sobre Detecção e Gerenciamento de Duplicados em SQL

Abaixo, estão algumas referências relevantes que cobrem desde conceitos básicos até estratégias avançadas para lidar com valores duplicados em tabelas SQL:

Documentação Oficial

  1. MySQL Documentation: “GROUP BY Optimization”
    Link: MySQL Docs
    Explicação detalhada sobre como GROUP BY funciona e como otimizar consultas para identificar duplicados.
  2. Oracle SQL Documentation: “Analytic Functions”
    Link: Oracle Docs
    Guia oficial sobre funções analíticas no Oracle Database, aplicáveis para encontrar duplicados.
  3. Microsoft SQL Server: “ROW_NUMBER (Transact-SQL)”
    Link: SQL Server Docs
    Documentação oficial sobre a função ROW_NUMBER, usada amplamente para marcar duplicados.

Livros

  1. “SQL em 10 Minutos por dia , Sams Teach Yourself” – Ben Forta
    Livro introdutório que cobre práticas essenciais de SQL, incluindo consultas com GROUP BY e manipulação de registros.

Ferramentas e Utilitários

  1. dbForge Studio for MySQL
    Link: dbForge
    Ferramenta para desenvolver e testar consultas SQL, incluindo recursos visuais para encontrar e remover duplicados.
  2. DBeaver
    Link: DBeaver
    Ferramenta gratuita para gerenciamento de bancos de dados com suporte a múltiplos SGBDs, ideal para explorar duplicados.
  3. SQL Fiddle
    Link: SQL Fiddle
    Ferramenta online para testar rapidamente consultas SQL em diferentes bancos de dados.

Conclusão

Estas referências fornecem uma base sólida para aprender e aplicar técnicas de identificação e manipulação de valores duplicados em SQL. Combine o conhecimento teórico com as ferramentas sugeridas para maximizar sua produtividade e eficiência em bancos de dados.

LEIA TAMBEM:

Perguntas Frequentes (FAQ): Duplicatas no SQL

Qual é o comando mais simples para encontrar duplicatas?

A forma mais universal de encontrar registros duplicados em uma coluna específica é utilizar as cláusulas GROUP BY e HAVING. Por exemplo: SELECT email, COUNT(*) FROM usuarios GROUP BY email HAVING COUNT(*) > 1;. Isso retornará apenas os e-mails que aparecem duas ou mais vezes na tabela.

Como deletar duplicatas mas manter apenas 1 registro original?

A técnica mais segura e moderna é usar uma CTE (Common Table Expression) combinada com a Window Function ROW_NUMBER(). Você agrupa os dados pelos campos duplicados (usando PARTITION BY) e atribui um número de linha sequencial para cada um, ordenado pelo ID. Em seguida, você faz um DELETE apenas nos registros onde o número da linha for maior que 1 (row_num > 1), garantindo que o primeiro registro intacto seja preservado.

Por que registros duplicados aparecem no banco de dados?

O motivo número um para o surgimento de duplicatas é a ausência de Constraints de Unicidade (UNIQUE) ou de uma Chave Primária (Primary Key) composta bem definida no esquema da tabela. Sem essas restrições, falhas no backend (como cliques duplos do usuário na interface, repetição de chamadas de API ou falhas na lógica de inserção/upsert) forçarão o banco de dados a aceitar dados idênticos sem reclamar.

É seguro rodar um DELETE de duplicatas direto em produção?

Não. Sempre execute a sua query como um SELECT primeiro para garantir que a lógica (especialmente o NOT IN ou o ROW_NUMBER) está marcando as linhas corretas para exclusão. Ao executar o DELETE, envolva a operação em uma Transação (BEGIN TRAN / COMMIT / ROLLBACK), para que você possa reverter caso a exclusão atinja mais registros do que o esperado.

Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade dedicado a linguagens de programação, banco de dados, DevOps, Internet das Coisas (IoT), tecnologias da Indústria 4.0, cibersegurança e startups. Com curadoria de conteúdos de qualidade, o projeto é mantido por Ramos de Souza Janones.

Mais recentes

Como aprender a programar, um guia definitivo

Última atualização em 23/04/2026. Guia completo sobre: Como aprender a programar. Espero que este “guia” ou “manifesto”, como prefiro chamar, seja...

Stream Deck para Desenvolvedores: o Console de Comando do Futuro

Esqueça os streamers. Descubra como o Stream Deck se tornou o hardware essencial para Engenheiros de IA e Full...

Como Usar o Skills in Chrome no Brasil: Tutorial Completo de IA

A inteligência artificial já faz parte do nosso fluxo de trabalho, mas ter que reescrever os mesmos prompts repetidamente...

Context Engineering: Como Arquitetar Dados para LLMs e RAG

Na edição desta newsletter intitulada “Engenharia de Prompt: Não é só mais uma buzzword“: https://www.linkedin.com/pulse/engenharia-de-prompt-n%C3%A3o-%C3%A9-s%C3%B3-mais-uma-buzzword-de-souza-janones-tpkxf tratei sobre o tema...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Aprender Idiomas com Google Tradutor: Na Prática

O Google está lançando um novo recurso experimental com tecnologia de IA no Google Tradutor, projetado para ajudar as...

Comunidades Internacionais de Desenvolvedores

Descubra as melhores comunidades internacionais de devs para 2026: GitHub, Stack Overflow, Discord e mais. Comparativo de salários Brasil vs. exterior e guia de carreira remota.

Mais Lidos

Placa de vídeo da NVIDIA RTX 4070 TI: Alto desempenho

Nova placa de vídeo da NVIDIA, RTX 4070 TI...

Desenvolvendo Competências Emergentes: ChatGPT no Trabalho

Um novo mercado nasceu, com inúmeras oportunidades e demandas...

IA no Terminal: Automatize Flows de Trabalho com Gemini CLI

Google acaba de lançar o Gemini CLI, uma ferramenta...

Google Stitch: Crie Interfaces Incríveis com IA em Minutos

Em apenas 18 de março de 2026, o Google...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.