Contando valores exclusivos
COUNT(DISTINCT ...) na prática.
Contando valores exclusivos é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Por que contar valores distintos?
Quando você usa COUNT(*), conta todas as linhas — inclusive as duplicatas. Mas, às vezes, você quer saber apenas quantos valores distintos existem em uma coluna.
Por exemplo: de quantos países diferentes vêm seus clientes? Quantos produtos distintos foram pedidos no mês passado? É nesse caso que entra COUNT(DISTINCT ...).
Preparando uma tabela de exemplo
Vamos criar uma tabela de pedidos para praticar. Cada pedido tem o nome de um cliente, um produto e um país.
Observe que alguns clientes e países aparecem mais de uma vez — isso é intencional, para que possamos ver a diferença entre contar todas as linhas e contar valores distintos.
CREATE TABLE orders (
id INT,
customer VARCHAR(50),
product VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Laptop', 'USA'),
(2, 'Bob', 'Phone', 'UK'),
(3, 'Alice', 'Tablet', 'USA'),
(4, 'Carol', 'Laptop', 'Canada'),
(5, 'Bob', 'Laptop', 'UK'),
(6, 'Dave', 'Phone', 'USA'),
(7, 'Carol', 'Phone', 'Canada'),
(8, 'Eve', 'Tablet', 'Germany');COUNT(*) versus COUNT(DISTINCT)
Execute as duas consultas e compare os resultados. COUNT(*) retorna 8 — uma contagem para cada linha. COUNT(DISTINCT customer) retorna 5 — porque existem apenas 5 clientes distintos (Alice, Bob, Carol, Dave e Eve).
Esta é a ideia central: COUNT(DISTINCT column) ignora valores repetidos e conta apenas os distintos.
SELECT COUNT(*) AS total_orders,
COUNT(DISTINCT customer) AS unique_customers
FROM orders;Contando países distintos
Vamos descobrir de quantos países diferentes vêm nossos clientes. Embora a tabela de pedidos tenha 8 linhas, várias linhas compartilham o mesmo país.
O resultado será 4 — USA, UK, Canadá e Alemanha — independentemente de quantas vezes cada país apareça.
SELECT COUNT(DISTINCT country) AS unique_countries
FROM orders;Contando produtos distintos
Podemos aplicar o mesmo padrão a qualquer coluna. Aqui contamos quantos produtos diferentes foram pedidos.
Embora “Laptop” apareça três vezes e “Phone” apareça três vezes, cada produto é contado apenas uma vez. A resposta é 3: Laptop, Phone e Tablet.
SELECT COUNT(DISTINCT product) AS unique_products
FROM orders;Usando COUNT(DISTINCT) com WHERE
Você pode combinar COUNT(DISTINCT ...) com uma cláusula WHERE para restringir as linhas antes da contagem. Aqui contamos os produtos distintos pedidos apenas por clientes dos USA.
Apenas as linhas em que country = 'USA' são consideradas; depois, contamos os produtos distintos entre essas linhas.
SELECT COUNT(DISTINCT product) AS usa_unique_products
FROM orders
WHERE country = 'USA';COUNT(DISTINCT) com GROUP BY
Quando combinado com GROUP BY, COUNT(DISTINCT ...) fornece contagens distintas por grupo. Esta consulta responde à pergunta: para cada país, quantos clientes distintos fizeram pedidos?
Cada grupo é processado de forma independente, portanto as duplicatas dentro de um grupo são removidas antes da contagem.
SELECT country,
COUNT(DISTINCT customer) AS unique_customers
FROM orders
GROUP BY country
ORDER BY unique_customers DESC;Contando valores distintos em várias colunas
Você pode usar várias expressões COUNT(DISTINCT ...) no mesmo SELECT. Isso fornece uma visão rápida da cardinalidade — quantos valores distintos cada coluna contém — tudo em uma única consulta.
Cardinalidade é uma métrica útil ao explorar um novo conjunto de dados.
SELECT COUNT(DISTINCT customer) AS unique_customers,
COUNT(DISTINCT product) AS unique_products,
COUNT(DISTINCT country) AS unique_countries
FROM orders;Como NULL é tratado
Assim como o COUNT(column) comum, COUNT(DISTINCT column) ignora valores NULL. Um NULL não é contado como um valor distinto.
Neste exemplo, duas linhas têm um país NULL. O resultado ainda é 4 países distintos não nulos, e não 5.
INSERT INTO orders VALUES
(9, 'Frank', 'Phone', NULL),
(10, 'Grace', 'Laptop', NULL);
SELECT COUNT(DISTINCT country) AS unique_countries_no_null
FROM orders;Comparando COUNT(*), COUNT(col) e COUNT(DISTINCT col)
É útil ver as três formas de COUNT lado a lado:
- COUNT(*) — conta todas as linhas, incluindo NULLs
- COUNT(country) — conta as linhas em que country não é NULL
- COUNT(DISTINCT country) — conta os valores distintos e não nulos de country
Execute isso na tabela atualizada (agora com 10 linhas, 2 delas com country NULL) para confirmar as diferenças.
SELECT COUNT(*) AS total_rows,
COUNT(country) AS non_null_countries,
COUNT(DISTINCT country) AS unique_countries
FROM orders;Caso de uso real: usuários ativos diariamente
Um dos usos mais comuns de COUNT(DISTINCT ...) em análises é contar os usuários ativos diariamente (DAU). Você tem um registro de eventos e quer saber quantos usuários distintos estiveram ativos a cada dia.
Agrupe pela data com GROUP BY e use COUNT(DISTINCT user_id) para obter uma contagem distinta de usuários por dia — as duplicatas do mesmo usuário ao clicar várias vezes são excluídas automaticamente.
CREATE TABLE user_events (
event_date DATE,
user_id INT
);
INSERT INTO user_events VALUES
('2024-01-01', 1), ('2024-01-01', 2), ('2024-01-01', 1),
('2024-01-02', 2), ('2024-01-02', 3), ('2024-01-02', 2),
('2024-01-03', 1), ('2024-01-03', 4);
SELECT event_date,
COUNT(DISTINCT user_id) AS daily_active_users
FROM user_events
GROUP BY event_date
ORDER BY event_date;Verificação rápida
Teste sua compreensão sobre COUNT(DISTINCT ...) com esta pergunta.
Resumo da lição
Excelente trabalho! Veja um resumo do que você aprendeu sobre COUNT(DISTINCT ...):
COUNT(DISTINCT column)conta apenas os valores distintos e não nulos de uma coluna.- Ele difere de
COUNT(*)(todas as linhas) e deCOUNT(column)(linhas não nulas). - Funciona com WHERE para filtrar as linhas antes da contagem.
- Funciona com GROUP BY para contar valores distintos por grupo.
- Os valores NULL são sempre excluídos da contagem distinta.
- Várias expressões
COUNT(DISTINCT ...)podem aparecer no mesmo SELECT. - Os usos comuns no mundo real incluem contar usuários, produtos, países e sessões distintos.
Dominar essa função oferece uma ferramenta poderosa para explorar dados e realizar análises.
Perguntas Frequentes
A aula “Contando valores exclusivos” é grátis?
Sim — o texto completo de “Contando valores exclusivos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Contando valores exclusivos”?
COUNT(DISTINCT ...) na prática. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Contando valores exclusivos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Noções básicas de SELECT DISTINCT
- DISTINCT em várias colunas
- DISTINCT ON do PostgreSQL
- Contando valores exclusivos