A regra de GROUP BY para colunas SELECT
Entenda por que toda coluna não agregada deve aparecer em GROUP BY e conheça o modo only-full-group-by.
A regra de GROUP BY para colunas SELECT é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 1 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.
Por que Entrevistadores Começam com GROUP BY
GROUP BY é onde as entrevistas distinguem iniciantes de profissionais de nível intermediário. A única regra que mais testam é: toda coluna da sua lista SELECT deve estar dentro de uma função de agregação ou ser listada em GROUP BY.
Se você violar essa regra, o mecanismo não conseguirá decidir qual valor exibir para um grupo que contém muitas linhas. Os entrevistadores inserem exatamente esse erro para verificar se você entende o que realmente é um grupo.
O que um Grupo Realmente É
GROUP BY reduz muitas linhas a uma linha por chave distinta. Depois do agrupamento, o mecanismo não tem mais as linhas individuais. Ele tem apenas uma linha de resumo por grupo.
- As colunas usadas para agrupar têm um valor claro por grupo.
- Agregações como
COUNT,SUM,AVGreduzem os muitos valores a um só. - Qualquer outra coluna bruta é ambígua: qual dos muitos valores deve aparecer?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;O Erro Clássico
Aqui está o erro que os entrevistadores adoram. Você agrupa por department, mas também seleciona name, uma coluna não agregada que não está em GROUP BY.
Cada departamento tem muitos funcionários, portanto há muitos nomes por grupo. O mecanismo não consegue escolher um, então o SQL padrão rejeita a consulta.
-- ERROR: name is not in GROUP BY and not aggregated
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;Duas Formas de Corrigir
Há duas correções legítimas, e o entrevistador quer ouvir que você sabe que ambas produzem respostas diferentes:
- Adicione a coluna a GROUP BY se você realmente quiser um agrupamento mais detalhado (uma linha por departamento e nome).
- Envolva-a em uma agregação como
MAX(name)ouCOUNT(name)se quiser um valor por grupo existente.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;ONLY_FULL_GROUP_BY no MySQL
Uma armadilha favorita: versões antigas do MySQL permitiam selecionar colunas não agrupadas e retornavam silenciosamente um valor arbitrário do grupo. Isso produzia relatórios incorretos que pareciam estar certos.
O MySQL moderno habilita ONLY_FULL_GROUP_BY por padrão, impondo a regra padrão. Postgres, SQL Server e Oracle sempre a impuseram. Se perguntarem por que uma consulta 'funcionava no servidor antigo, mas agora apresenta erro', essa é a resposta.
-- Legal under ONLY_FULL_GROUP_BY because every
-- selected column is grouped or aggregated
SELECT department, MAX(hire_date) AS latest_hire
FROM employees
GROUP BY department;Exceção da Dependência Funcional
Há uma sutileza que os entrevistadores usam para testar seu conhecimento aprofundado. Se você agrupar pela chave primária de uma tabela, todas as outras colunas dessa tabela terão dependência funcional em relação à chave e, portanto, exatamente um valor por grupo.
Postgres e as versões modernas do MySQL permitem selecionar essas colunas dependentes sem listá-las. A chave agrupada as determina de forma exclusiva, portanto não há ambiguidade.
-- Legal: id is the PK, so name is determined by it
SELECT e.id, e.name, COUNT(o.id) AS orders
FROM employees e
LEFT JOIN orders o ON o.employee_id = e.id
GROUP BY e.id;Exemplo Resolvido: Vendas por Região
Suponha que você precise informar o total de vendas por região. A chave de agrupamento é region; a medida é SUM(amount). Todo o restante deve ser agregado ou removido.
Observe como isso é claro: uma linha por região, cada uma contendo um único valor somado. Esse é o formato de todo relatório agregado.
SELECT region,
SUM(amount) AS total_sales,
COUNT(*) AS num_orders,
AVG(amount) AS avg_order
FROM sales
GROUP BY region;Misturando Detalhes e Resumo
Um enunciado capcioso: 'Mostre o valor de cada pedido junto com o total da sua região.' Você não pode fazer isso com um GROUP BY simples, porque o agrupamento destrói as linhas individuais.
A resposta correta é uma função de janela (SUM(amount) OVER (PARTITION BY region)) ou uma junção de volta a uma subconsulta agrupada. Reconhecer que GROUP BY é a ferramenta errada aqui é o objetivo da pergunta.
-- Detail rows kept, region total added per row
SELECT order_id, region, amount,
SUM(amount) OVER (PARTITION BY region) AS region_total
FROM sales;GROUP BY e Apelidos de SELECT
Você pode agrupar por um apelido definido em SELECT? Isso depende do dialeto, e é justamente essa inconsistência que os entrevistadores investigam.
- MySQL e Postgres: permitem agrupar por um apelido de SELECT.
- SQL Server e Oracle: não permitem; você precisa repetir a expressão completa.
A resposta portável é repetir a expressão em GROUP BY, o que funciona em qualquer lugar.
-- Portable: repeat the expression rather than the alias
SELECT EXTRACT(YEAR FROM order_date) AS yr, COUNT(*)
FROM sales
GROUP BY EXTRACT(YEAR FROM order_date);DISTINCT vs GROUP BY para Obter Unicidade
Se você quiser apenas combinações distintas e nenhuma agregação, GROUP BY sem agregação se comporta como DISTINCT. Os entrevistadores podem perguntar qual opção é mais clara.
Use DISTINCT para expressar a intenção ('quero linhas únicas'). Reserve GROUP BY para quando também calcular agregações. Mesmo resultado, sinal de legibilidade diferente.
-- These return the same rows
SELECT DISTINCT department, role FROM employees;
SELECT department, role FROM employees GROUP BY department, role;Como Dizer Isso na Entrevista
Quando encontrar uma pergunta sobre GROUP BY, explique a regra em voz alta: 'Toda coluna selecionada é uma chave de agrupamento ou está envolvida em uma agregação, porque o agrupamento deixa uma linha por chave.'
Em seguida, declare sua chave de agrupamento e suas medidas e confirme que nada passa sem agrupamento. Essa resposta estruturada demonstra competência de nível intermediário antes mesmo de você escrever a consulta.
Verificação rápida
Teste sua compreensão da regra fundamental de GROUP BY.
Recapitulação
A regra: toda coluna de SELECT é uma chave de agrupamento ou um agregado. Por quê: GROUP BY deixa uma linha por chave, portanto colunas brutas não agrupadas são ambíguas.
- Corrija as violações agrupando a coluna ou agregando-a.
- O comportamento antigo do MySQL retornava valores arbitrários;
ONLY_FULL_GROUP_BYimpõe o padrão. - A dependência funcional da chave primária é a única exceção válida.
- Para manter as linhas detalhadas ao lado dos totais dos grupos, use funções de janela, não GROUP BY.
Perguntas Frequentes
A aula “A regra de GROUP BY para colunas SELECT” é grátis?
Sim — o texto completo de “A regra de GROUP BY para colunas SELECT” é 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 “A regra de GROUP BY para colunas SELECT”?
Entenda por que toda coluna não agregada deve aparecer em GROUP BY e conheça o modo only-full-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 1 de 4.
Quanto tempo leva a aula “A regra de GROUP BY para colunas SELECT”?
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
- A regra de GROUP BY para colunas SELECT
- HAVING versus WHERE
- Agrupando por várias colunas e expressões
- Contando e filtrando grupos