- 1 1. Introdução
- 2 2. Conceitos Básicos de Contagem de Dados no MySQL (COUNT)
- 3 3. Recuperando Dados sem Duplicatas (DISTINCT)
- 4 4. Como Usar COUNT(DISTINCT nome_da_coluna)
- 5 5. Usando COUNT(DISTINCT) com Múltiplas Colunas
- 6 6. Otimização de Performance para COUNT(DISTINCT)
- 7 7. Erros Comuns e Soluções para COUNT(DISTINCT)
- 8 8. Perguntas Frequentes (FAQ)
- 9 9. Conclusão
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()eDISTINCT - 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 Function | Description |
|---|---|
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:
| id | name | country | |
|---|---|---|---|
| 1 | Taro | taro@example.com | Japan |
| 2 | Hanako | hanako@example.com | Japan |
| 3 | John | NULL | United States |
| 4 | Tanaka | tanaka@example.com | Japan |
① 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
| Feature | DISTINCT | GROUP BY |
|---|---|---|
| Purpose | Retrieve unique values | Perform aggregation by group |
| Usage | SELECT DISTINCT column_name | SELECT column_name, COUNT(*) GROUP BY column_name |
| Example | Retrieve unique countries | Count users per country |
💡 Pontos‑Chave:
DISTINCTsimplesmente remove dados duplicados.GROUP BYagrupa 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
EXPLAINpermite 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 BYpode oferecer melhor desempenho comparado aoCOUNT(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
EXPLAINpara 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
| Function | Description |
|---|---|
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?
| Feature | DISTINCT | GROUP BY |
|---|---|---|
| Purpose | Retrieve unique values | Perform aggregation by group |
| Usage | SELECT DISTINCT column_name | SELECT column_name, COUNT(*) GROUP BY column_name |
| Example | Retrieve unique countries | Count 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:
DISTINCTsimplesmente remove dados duplicados.GROUP BYagrupa 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 BYpode gerar resultados mais rápidos queCOUNT(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 registrosCOUNT(column_name)conta valores excluindo NULLCOUNT(DISTINCT column_name)recupera o número de valores únicos
✅ A diferença entre DISTINCT e COUNT(DISTINCT)
DISTINCTrecupera dados com duplicatas removidasCOUNT(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, useCONCAT()em vez disso
✅ Técnicas de otimização de desempenho
- Aplicar índices para melhorar o desempenho da busca
- Use
GROUP BY + COUNTpara 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!


