COUNT(DISTINCT) do MySQL Explicado: Como Contar Valores Únicos de Forma Eficiente

目次

1. Introdução

Ao gerenciar um banco de dados, você pode se deparar com situações como: “Quantos países diferentes foram registrados?” ou “Quantos endereços de e‑mail únicos existem?”
Nesses casos, você pode usar COUNT(DISTINCT nome_da_coluna) do MySQL para obter o número de registros eliminando duplicatas.

Este artigo explica os seguintes tópicos em detalhes:

  • O básico de COUNT() e DISTINCT
  • O uso correto de COUNT(DISTINCT nome_da_coluna)
  • Como contar valores únicos em várias colunas
  • Como melhorar o desempenho de COUNT(DISTINCT)

Mesmo iniciantes podem entender facilmente este guia, pois explicamos tudo com exemplos práticos e consultas SQL. Certifique‑se de ler até o final.

2. Conceitos Básicos de Contagem de Dados no MySQL (COUNT)

Ao analisar dados em um banco de dados, a função mais fundamental é COUNT().
Vamos primeiro entender como COUNT() funciona.

2.1 Diferença entre COUNT(*) e COUNT(nome_da_coluna)

A função COUNT() no MySQL pode ser usada das duas maneiras a seguir:

COUNT FunctionDescription
COUNT(*)Counts all records in the table (including NULL values)
COUNT(column_name)Counts non-NULL values in a specific column

2.2 Exemplos Básicos de COUNT()

Aqui, usaremos a tabela users a seguir como exemplo:

idnameemailcountry
1Tarotaro@example.comJapan
2Hanakohanako@example.comJapan
3JohnNULLUnited States
4Tanakatanaka@example.comJapan

① Recuperar o Número Total de Registros na Tabela

SELECT COUNT(*) FROM users;

→ Resultado: 4 (Número total de registros)

② Recuperar o Número de Valores Não‑NULL em uma Coluna Específica

SELECT COUNT(email) FROM users;

→ Resultado: 3 (Número de valores email não‑NULL)

💡 Pontos‑Chave:

  • COUNT(*) recupera o número total de registros incluindo valores NULL.
  • COUNT(email) exclui valores NULL ao contar.

3. Recuperando Dados sem Duplicatas (DISTINCT)

Ao agregar dados, há muitos casos em que você deseja obter apenas valores únicos.
Nessas situações, DISTINCT é muito útil.

3.1 Conceitos Básicos de DISTINCT

DISTINCT é usado para eliminar dados duplicados da coluna especificada e retornar resultados únicos.

Sintaxe Básica

SELECT DISTINCT column_name FROM table_name;

3.2 Exemplo de Uso do DISTINCT

Executando a consulta SQL a seguir, você pode obter uma lista de nomes de países únicos registrados pelos usuários.

SELECT DISTINCT country FROM users;

→ Resultado:

country
Japan
United States

3.3 Diferença entre DISTINCT e GROUP BY

FeatureDISTINCTGROUP BY
PurposeRetrieve unique valuesPerform aggregation by group
UsageSELECT DISTINCT column_nameSELECT column_name, COUNT(*) GROUP BY column_name
ExampleRetrieve unique countriesCount users per country

💡 Pontos‑Chave:

  • DISTINCT simplesmente remove dados duplicados.
  • GROUP BY agrupa dados e é usado junto com funções de agregação.

4. Como Usar COUNT(DISTINCT nome_da_coluna)

Usando COUNT(DISTINCT nome_da_coluna), você pode obter o número de valores únicos.

4.1 Conceitos Básicos de COUNT(DISTINCT)

Sintaxe Básica

SELECT COUNT(DISTINCT column_name) FROM table_name;

4.2 Exemplo de COUNT(DISTINCT)

SELECT COUNT(DISTINCT country) FROM users;

→ Resultado: 2 (Dois tipos: “Japão” e “Estados Unidos”)

4.3 Usando COUNT(DISTINCT) com Condições

SELECT COUNT(DISTINCT email) FROM users WHERE country = 'Japan';

→ Resultado: 2 (Número de valores email únicos registrados no Japão)

💡 Pontos‑Chave:

  • COUNT(DISTINCT nome_da_coluna) exclui valores NULL e conta apenas dados únicos.
  • Ao usar uma cláusula WHERE, você pode contar registros que atendam a condições específicas.

5. Usando COUNT(DISTINCT) com Múltiplas Colunas

No MySQL, COUNT(DISTINCT coluna1, coluna2) não pode ser usado diretamente. Em vez disso, uma solução comum é combinar as colunas usando CONCAT() e tratá‑las como um único valor.

5.1 Por que COUNT(DISTINCT coluna1, coluna2) Não Pode Ser Usado

No MySQL, você não pode aplicar COUNT(DISTINCT) diretamente a várias colunas assim: COUNT(DISTINCT coluna1, coluna2).
Isso se deve a uma limitação do MySQL.

5.2 Como Contar Combinações Únicas em Várias Colunas

Para contar combinações únicas de múltiplas colunas, a abordagem típica é combinar as colunas usando CONCAT() e então aplicar COUNT(DISTINCT) ao resultado.

Exemplo: Contar Combinações Únicas de País e Cidade

SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;

💡 Pontos Principais:

  • Usar CONCAT(column1, '-', column2) permite combinar múltiplas colunas em um único valor único.
  • COUNT(DISTINCT CONCAT(...)) permite obter o número de combinações únicas entre várias colunas.

6. Otimização de Performance para COUNT(DISTINCT)

COUNT(DISTINCT) pode impactar a performance, portanto a otimização pode ser necessária.
Ao trabalhar com grandes conjuntos de dados, recomenda-se considerar usar índices ou abordagens alternativas.

6.1 Por que COUNT(DISTINCT) pode ser lento

  • O MySQL frequentemente varre todos os registros para aplicar DISTINCT.
  • Se os índices não estiverem configurados corretamente, a execução da consulta torna-se mais lenta.
  • Um alto volume de dados duplicados aumenta a carga computacional.

6.2 Otimização de Índices para Acelerar COUNT(DISTINCT)

Ao lidar com grandes quantidades de dados, você pode melhorar o desempenho da consulta adicionando um índice à coluna alvo.

Como Adicionar um Índice

ALTER TABLE users ADD INDEX (country);

Verificar o Plano de Execução da Consulta Usando um Índice

EXPLAIN SELECT COUNT(DISTINCT country) FROM users;

💡 Pontos Principais:

  • Usar EXPLAIN permite verificar como o MySQL processa uma consulta.
  • Aplicar um índice pode ajudar a evitar varreduras completas da tabela e melhorar o desempenho da busca.

6.3 Método Alternativo: GROUP BY + COUNT

Dependendo do requisito de agregação, usar GROUP BY pode proporcionar melhor desempenho.

Exemplo: Contar Dados Únicos Usando GROUP BY

SELECT country, COUNT(*) FROM users GROUP BY country;

💡 Pontos Principais:

  • GROUP BY pode oferecer melhor desempenho comparado ao COUNT(DISTINCT) em alguns casos.
  • É especialmente útil quando você precisa agrupar e agregar dados simultaneamente.

7. Erros Comuns e Soluções para COUNT(DISTINCT)

Ao usar COUNT(DISTINCT), você pode encontrar vários erros comuns.
Aqui, apresentamos problemas típicos e suas soluções.

7.1 Erro 1: COUNT(DISTINCT column1, column2) Não Pode Ser Usado

Causa do Erro

No MySQL, COUNT(DISTINCT column1, column2) não é suportado ao direcionar múltiplas colunas.
Usar essa sintaxe diretamente resultará em um erro.

Solução: Use CONCAT()

Você pode evitar esse erro combinando múltiplas colunas e aplicando COUNT(DISTINCT) ao resultado.

SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;

💡 Pontos Principais:

  • Usar CONCAT(column1, '-', column2) permite criar valores únicos a partir de múltiplas colunas.
  • COUNT(DISTINCT CONCAT(...)) permite obter valores únicos para cada combinação.

7.2 Erro 2: Resultados Inesperados Quando Valores NULL São Incluídos

Causa do Erro

  • COUNT(DISTINCT column_name) ignora valores NULL, o que pode causar resultados inesperados se a coluna contiver NULLs.

Solução: Use IFNULL()

Você pode substituir NULL por outro valor padrão (ex.: '' ou 'unknown') para garantir a contagem correta.

SELECT COUNT(DISTINCT IFNULL(email, 'unknown')) FROM users;

💡 Pontos Principais:

  • Ao usar IFNULL(column_name, 'valor_padrão'), você pode tratar valores NULL adequadamente.

7.3 Erro 3: COUNT(DISTINCT) É Lento

Causa do Erro

  • COUNT(DISTINCT) varre todos os dados, o que pode resultar em desempenho lento com grandes conjuntos de dados.

Solução: Use Índices

ALTER TABLE users ADD INDEX (country);

💡 Pontos Principais:

  • Adicionar índices pode melhorar o desempenho da consulta.
  • Use EXPLAIN para verificar o status da otimização da consulta.
    EXPLAIN SELECT COUNT(DISTINCT country) FROM users;
    

Ao aplicar essas medidas, você pode melhorar a praticidade do COUNT(DISTINCT) e evitar problemas de desempenho.

8. Perguntas Frequentes (FAQ)

Aqui estão algumas perguntas frequentes sobre COUNT(DISTINCT).

8.1 Qual é a diferença entre COUNT(*) e COUNT(DISTINCT column_name)?

Diferenças Principais

FunctionDescription
COUNT(*)Counts all records (including NULL values)
COUNT(DISTINCT column_name)Counts unique values (excluding NULL values)

Exemplo de Uso

SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT email) FROM users;

💡 Pontos Principais:

  • COUNT(*) conta todos os registros.
  • COUNT(DISTINCT column_name) recupera o número de valores únicos (excluindo NULL).

8.2 Qual é a diferença entre DISTINCT e GROUP BY?

FeatureDISTINCTGROUP BY
PurposeRetrieve unique valuesPerform aggregation by group
UsageSELECT DISTINCT column_nameSELECT column_name, COUNT(*) GROUP BY column_name
ExampleRetrieve unique countriesCount users per country

Exemplo de Uso

-- Using DISTINCT
SELECT DISTINCT country FROM users;

-- Using GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;

💡 Pontos Principais:

  • DISTINCT simplesmente remove dados duplicados.
  • GROUP BY agrupa dados e pode ser combinado com funções de agregação.

8.3 O COUNT(DISTINCT) é lento?

Problema

  • COUNT(DISTINCT) varre todos os dados, portanto o desempenho pode degradar em conjuntos de dados grandes.

Solução: Use Índices

ALTER TABLE users ADD INDEX (country);

Abordagem Alternativa: Use GROUP BY

SELECT country, COUNT(*) FROM users GROUP BY country;

💡 Pontos Principais:

  • Aplicar índices pode melhorar o desempenho da busca.
  • Usar GROUP BY pode gerar resultados mais rápidos que COUNT(DISTINCT) em alguns casos.

8.4 Como posso usar COUNT(DISTINCT column1, column2)?

Problema

  • No MySQL, COUNT(DISTINCT column1, column2) não é suportado.

Solução: Use CONCAT()

SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;

💡 Pontos Principais:

  • Usar CONCAT(column1, '-', column2) permite criar valores únicos em várias colunas.
  • COUNT(DISTINCT CONCAT(...)) permite recuperar combinações únicas.

Ao consultar estas perguntas, você pode usar COUNT(DISTINCT) de forma mais eficiente.

9. Conclusão

Neste artigo, explicamos em detalhes como usar a função COUNT(DISTINCT) do MySQL.
Vamos revisar os principais pontos.

9.1 O que você aprendeu neste artigo

Como contar registros no MySQL

  • COUNT(*) recupera o número total de registros
  • COUNT(column_name) conta valores excluindo NULL
  • COUNT(DISTINCT column_name) recupera o número de valores únicos

A diferença entre DISTINCT e COUNT(DISTINCT)

  • DISTINCT recupera dados com duplicatas removidas
  • COUNT(DISTINCT column_name) conta o número de valores únicos

Como usar COUNT(DISTINCT) com múltiplas colunas

  • Como o MySQL não suporta COUNT(DISTINCT column1, column2) diretamente, use CONCAT() em vez disso

Técnicas de otimização de desempenho

  • Aplicar índices para melhorar o desempenho da busca
  • Use GROUP BY + COUNT para consultas mais rápidas quando apropriado

9.2 O que você pode fazer com esse conhecimento

Ao aplicar esse conhecimento, você pode realizar os seguintes tipos de agregação de dados:
🔹 Contar usuários únicos
🔹 Recuperar contagens de registros com base em condições específicas
🔹 Contar dados únicos em várias colunas
🔹 Otimizar consultas para grandes conjuntos de dados

Ao realizar agregação e otimização de dados no MySQL, certifique‑se de usar este guia como referência!