DISTINCT versus GROUP BY para exclusividade
Saiba quando DISTINCT é a resposta certa e quando o entrevistador espera GROUP BY.
DISTINCT versus GROUP BY para exclusividade é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 3 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
O que DISTINCT faz
DISTINCT remove linhas duplicadas. O ponto principal que os entrevistadores verificam é que ele funciona na linha selecionada inteira, não em uma única coluna — portanto, SELECT DISTINCT a, b elimina duplicatas do par (a, b).
SELECT DISTINCT department
FROM employees;DISTINCT abrange todas as colunas selecionadas
Com várias colunas, DISTINCT mantém cada combinação única — uma linha para cada par distinto (departamento, cargo). Não existe uma forma padrão de eliminar duplicatas de apenas uma coluna.
SELECT DISTINCT department, job_title
FROM employees;O que GROUP BY faz
GROUP BY reúne em uma única linha por grupo as linhas que compartilham a mesma chave. Por si só, agrupar por uma coluna produz o mesmo resultado que aplicar DISTINCT a ela.
SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;A diferença real: agregação
Então, quando eles diferem? Quando você precisa de uma agregação. GROUP BY pode calcular COUNT, SUM ou AVG por grupo; DISTINCT não pode. Precisa de linhas únicas? DISTINCT. Precisa de uma métrica por grupo? GROUP BY.
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;DISTINCT não pode contar por grupo
Não é possível acrescentar uma contagem a DISTINCT. Para saber "quantos funcionários há por departamento", a ferramenta correta é sempre GROUP BY com COUNT(*) — não SELECT DISTINCT.
-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;
-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;COUNT(DISTINCT) combina as duas ideias
Uma combinação muito útil: COUNT(DISTINCT coluna) conta valores únicos dentro de cada grupo. Aqui, DISTINCT fica dentro da agregação, respondendo a "quantos cargos distintos há por departamento?"
SELECT department,
COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;Contando valores distintos no total
Sem GROUP BY, COUNT(DISTINCT coluna) conta os valores únicos em toda a tabela — uma resposta direta para "quantos departamentos diferentes temos?"
SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;
-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;O desempenho geralmente é equivalente
DISTINCT ou GROUP BY é mais rápido? Para uma simples eliminação de duplicatas, geralmente são equivalentes — os otimizadores fazem planos semelhantes para ambos. Escolha conforme a intenção: DISTINCT para linhas únicas, GROUP BY ao fazer agregações.
DISTINCT e NULL
Como DISTINCT trata NULL? Ele considera todos os NULL como iguais, portanto muitas linhas com NULL são reunidas em uma só. GROUP BY faz o mesmo — os NULL formam um único grupo.
-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;DISTINCT ON do Postgres (bônus)
Bônus: o Postgres tem um DISTINCT ON (expressão) não padrão que mantém a primeira linha por chave, conforme um ORDER BY. O código portável usa ROW_NUMBER() em vez disso.
-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;DISTINCT se aplica a todo o SELECT, não a uma única coluna
Mais uma armadilha: DISTINCT funciona na linha inteira, portanto SELECT DISTINCT id_cliente, data_pedido não fornecerá uma linha por cliente. Para isso, use GROUP BY com MAX ou uma função de janela.
-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;
-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;Verificação rápida
Escolha a ferramenta certa.
Recapitulação
Recapitulando: DISTINCT elimina duplicatas de linhas inteiras; GROUP BY reúne linhas por chave e permite agregações. COUNT(DISTINCT coluna) conta valores únicos, ambos tratam NULL como um único valor, e o desempenho geralmente é equivalente.
Perguntas Frequentes
A aula “DISTINCT versus GROUP BY para exclusividade” é grátis?
Sim — o texto completo de “DISTINCT versus GROUP BY para exclusividade” é 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 Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “DISTINCT versus GROUP BY para exclusividade”?
Saiba quando DISTINCT é a resposta certa e quando o entrevistador espera GROUP BY. Você pratica SQL Interview Prep 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 Interview Prep?
Nenhuma experiência prévia é necessária. SQL Interview Prep 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 3 de 4.
Quanto tempo leva a aula “DISTINCT versus GROUP BY para exclusividade”?
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 Interview Prep?
Sim. Cada aula de SQL Interview Prep 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
- Projetando colunas e armadilhas de alias
- Colunas calculadas e precedência de expressões
- DISTINCT versus GROUP BY para exclusividade
- Expressões CASE em SELECT