0Pricing
Coding Interview Prep · Aula

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 Coding 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding 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 Coding 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 Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding 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 Coding Interview Prep?

Sim. Cada aula de Coding 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

  1. Projetando colunas e armadilhas de alias
  2. Colunas calculadas e precedência de expressões
  3. DISTINCT versus GROUP BY para exclusividade
  4. Expressões CASE em SELECT
← Voltar para Coding Interview Prep