0Pricing
SQL Interview Prep · Aula

Agregações sem GROUP BY

Veja como uma agregação simples transforma uma tabela inteira em uma única linha.

Agregações sem GROUP BY é uma aula grátis de SQL Interview Prep 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 Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.

Uma função de agregação, uma linha

Os entrevistadores testam uma ideia fundamental com esta pergunta: "O que acontece quando se usa uma função de agregação sem GROUP BY?"

A resposta é: a tabela inteira é reduzida a uma única linha. A função de agregação trata todas as linhas qualificadas como um único grupo implícito. Compreender esse modelo de "grupo implícito" explica muitas regras posteriores, então vamos construí-lo com cuidado.

O grupo único implícito

Quando se escreve uma função de agregação isolada sem GROUP BY, o SQL se comporta como se houvesse um grupo contendo todas as linhas. O resultado sempre tem exatamente uma linha, independentemente de quantas linhas a tabela tenha — mesmo que a tabela esteja vazia.

Assim, SELECT COUNT(*) FROM employees retorna uma linha, com um número, resumindo a tabela inteira.

SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one row

Várias funções de agregação juntas

É possível listar várias funções de agregação em um único SELECT. Todas resumem o mesmo grupo implícito, portanto ainda se obtém exatamente uma linha com várias colunas.

Essa é a consulta padrão para "mostrar as estatísticas resumidas". Os quatro números descrevem o mesmo conjunto completo de linhas.

SELECT
  COUNT(*)     AS num_rows,
  SUM(salary)  AS total_pay,
  AVG(salary)  AS avg_pay,
  MAX(salary)  AS top_pay
FROM employees;

O erro de misturar colunas

Esta é a regra mais cobrada. Não se pode misturar uma função de agregação isolada com uma coluna não agregada no mesmo SELECT sem GROUP BY.

Por quê? A função de agregação produz uma linha, mas uma coluna comum tem vários valores — qual deles deveria ser exibido? Isso é ambíguo, então o SQL padrão gera um erro.

-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;

Por que isso é ambíguo

Pense nisso usando nossa tabela. MAX(salary) reduz todas as linhas a um único valor. Mas name tem um valor diferente em cada linha. A única linha de resumo não pode conter cinco nomes em uma célula.

O banco de dados se recusa a adivinhar. Esse é o mesmo princípio por trás da regra de GROUP BY: toda coluna selecionada deve ser agregada ou fazer parte do grupo. Sem GROUP BY, somente funções de agregação são permitidas.

A exceção permissiva do MySQL

Vale mencionar uma particularidade de um dialeto: versões antigas ou não estritas do MySQL permitiam a consulta com a mistura e retornavam um nome arbitrário — não necessariamente o da pessoa com maior salário.

O MySQL moderno com ONLY_FULL_GROUP_BY habilitado (o padrão atual) rejeita a consulta, como os demais. Mencionar isso demonstra conhecimento de diferentes dialetos, mas considere sempre a consulta mista incorreta.

Obtendo a linha por trás do máximo

Então, como obter o nome da pessoa com o maior salário? Não misturando colunas. Use ORDER BY + LIMIT ou uma subconsulta que compare com o resultado da função de agregação.

A versão com ORDER BY/LIMIT é a mais simples. A versão com subconsulta generaliza bem e retorna todas as pessoas empatadas com o valor máximo.

-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

Funções de agregação em uma tabela vazia

Um caso extremo que os entrevistadores costumam apresentar é: "O que uma função de agregação isolada retorna em uma tabela vazia?"

  • COUNT(*) retorna 0 (uma linha, com o valor 0).
  • SUM, AVG, MIN, MAX retornam NULL (uma linha, com valor NULL).

É importante notar que ainda se obtém uma linha de volta, nunca zero linhas. Essa garantia de uma única linha é justamente o objetivo de uma função de agregação sem GROUP BY.

SELECT COUNT(*) AS c, SUM(salary) AS s, MAX(salary) AS m
FROM employees
WHERE 1 = 0;
-- one row: c=0, s=NULL, m=NULL

Não há agregação de agregação em WHERE

Outra regra que decorre desse modelo é que não se pode colocar uma função de agregação em uma cláusula WHERE, porque WHERE filtra linhas individuais antes que a agregação aconteça.

Para filtrar pelo resultado de uma função de agregação, use HAVING (com agrupamento) ou envolva a função de agregação em uma subconsulta. WHERE simplesmente é executado cedo demais na ordem de execução para enxergar o resultado da agregação.

-- ERROR: aggregate not allowed in WHERE
-- SELECT * FROM employees WHERE salary > AVG(salary);

-- Correct: compare to the aggregate via subquery
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Função de agregação isolada versus GROUP BY

Formule o contraste:

  • Sem GROUP BY: um grupo implícito = a tabela inteira = exatamente uma linha de resultado.
  • Com GROUP BY col: um grupo para cada valor distinto de col = uma linha por grupo.

Uma função de agregação isolada é simplesmente um GROUP BY com zero colunas de agrupamento. O mesmo mecanismo, em um único grande grupo.

-- Whole table: one row
SELECT AVG(salary) FROM employees;

-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

Como explicar isso

Uma resposta clara seria: "Uma função de agregação sem GROUP BY trata todo o conjunto de resultados como um único grupo implícito e retorna exatamente uma linha de resumo, mesmo em uma tabela vazia. Não é possível selecionar uma coluna não agregada junto com ela, porque esse valor seria ambíguo. Para obter a linha por trás de um MAX ou MIN, uso ORDER BY com LIMIT ou uma subconsulta que compare com o resultado da função de agregação."

Verificação rápida

Preveja o formato do resultado.

Recapitulação

Funções de agregação sem GROUP BY em resumo:

  • A tabela inteira se torna um grupo implícito → exatamente uma linha de resultado.
  • Não se pode misturar uma função de agregação isolada com uma coluna não agregada.
  • Tabela vazia: COUNT(*) = 0; as demais retornam NULL, ainda em uma única linha.
  • As funções de agregação não podem aparecer em WHERE; use uma subconsulta ou HAVING.
  • Para obter a linha por trás de MIN/MAX, use ORDER BY + LIMIT ou uma subconsulta.

Com isso, terminam os exercícios de entrevista sobre funções de agregação.

Perguntas Frequentes

A aula “Agregações sem GROUP BY” é grátis?

Sim — o texto completo de “Agregações sem GROUP BY” é 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 “Agregações sem GROUP BY”?

Veja como uma agregação simples transforma uma tabela inteira em uma única linha. 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 4 de 4.

Quanto tempo leva a aula “Agregações sem GROUP BY”?

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

  1. COUNT(*) versus COUNT(coluna) versus COUNT(DISTINCT)
  2. SUM e AVG com NULLs
  3. MIN, MAX e agregação não numérica
  4. Agregações sem GROUP BY
← Voltar para SQL Interview Prep