Entendendo as Cláusulas GROUP BY, HAVING e WHERE no SQL – Guia Prático para Concursos

Por
3 min. de leitura

Por Prof. Dr. Washington Almeida – Gran Cursos Online

Ao estudar SQL para concursos públicos, é comum encontrar questões que exigem o domínio de cláusulas específicas que controlam como os dados são agrupados e filtrados. Dentre elas, as cláusulas GROUP BY, HAVING e WHERE são frequentemente cobradas por sua importância em consultas analíticas. Este artigo tem como objetivo esclarecer o papel de cada uma delas, trazendo exemplos práticos e comparações diretas para que você acerte a questão na hora da prova.

A cláusula GROUP BY é utilizada quando se deseja agrupar linhas que possuam valores iguais em uma ou mais colunas. Ela normalmente aparece em conjunto com funções de agregação como SUM(), AVG(), MAX(), MIN() e COUNT().

Por exemplo, suponha uma tabela de vendas chamada VENDAS com os seguintes campos: id_venda, id_vendedor, valor, data.

Se quisermos saber quanto cada vendedor vendeu ao longo do mês, podemos usar:

SELECT id_vendedor, SUM(valor) AS total_vendas
FROM VENDAS
GROUP BY id_vendedor;

Antes de agrupamentos, é comum que desejemos filtrar os dados da tabela. A cláusula WHERE é utilizada para filtrar os registros individuais antes de qualquer agregação.

Seguindo o exemplo anterior, suponha que queiramos considerar apenas as vendas do mês de março:

SELECT id_vendedor, SUM(valor) AS total_vendas
FROM VENDAS
WHERE EXTRACT(MONTH FROM data) = 3
GROUP BY id_vendedor;

Observe que o filtro por mês foi aplicado antes do agrupamento. Isso é essencial, pois o WHERE atua diretamente sobre as linhas da tabela.

Enquanto o WHERE atua sobre as linhas brutas da tabela, o HAVING atua sobre os grupos formados pelo GROUP BY. É com o HAVING que podemos filtrar os resultados agregados.

Se quisermos ver apenas os vendedores que venderam mais de R$ 10.000,00 em março, usamos:

SELECT id_vendedor, SUM(valor) AS total_vendas
FROM VENDAS
WHERE EXTRACT(MONTH FROM data) = 3
GROUP BY id_vendedor
HAVING SUM(valor) > 10000;

Essa distinção entre WHERE e HAVING é muito cobrada em concursos. O WHERE filtra antes da agregação, e o HAVING, depois.

Se você tentar usar uma função agregadora dentro de WHERE, como SUM(valor) > 10000, o SGBD retornará erro. Isso porque, até esse ponto da execução, a soma ainda não foi realizada.

Internamente, o SGBD executa a consulta SQL na seguinte ordem lógica:
1. FROM (inclusive JOINs)
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY

Saber essa ordem ajuda a entender por que HAVING é o local adequado para filtrar funções agregadas.

Vamos montar uma consulta completa:

SELECT id_vendedor, COUNT(*) AS qtd_vendas, SUM(valor) AS total_vendas
FROM VENDAS
WHERE data >= DATE ‘2025-03-01’ AND data <= DATE ‘2025-03-31’
GROUP BY id_vendedor
HAVING SUM(valor) > 15000;

Muitas bancas apresentam pegadinhas onde o candidato precisa diferenciar WHERE e HAVING. Por exemplo:

“Em uma consulta SQL que agrupa registros com GROUP BY, o filtro sobre os valores resultantes de funções de agregação deve ser feito na cláusula WHERE.”

Essa afirmativa está errada, pois a cláusula correta é HAVING.

É possível agrupar por mais de uma coluna:

SELECT id_vendedor, EXTRACT(YEAR FROM data) AS ano, SUM(valor)
FROM VENDAS
GROUP BY id_vendedor, EXTRACT(YEAR FROM data);

Sim, é possível utilizar HAVING sem GROUP BY quando se deseja filtrar uma única linha resultante de uma função agregadora global:

SELECT SUM(valor) AS total_geral
FROM VENDAS
HAVING SUM(valor) > 50000;

Podemos ordenar os resultados após o agrupamento:

SELECT id_vendedor, COUNT(*) AS qtd_vendas
FROM VENDAS
GROUP BY id_vendedor
ORDER BY qtd_vendas DESC;

É boa prática usar AS para nomear colunas agregadas, como SUM(valor) AS total. Isso facilita a leitura dos resultados e evita confusão ao trabalhar com dados agregados em relatórios.

Consultas com GROUP BY e HAVING são base para dashboards, painéis de BI e sistemas de relatórios. Saber manipular essas cláusulas é essencial para quem trabalha com análise de dados e banco de dados.

Filtrar dados com WHERE antes do GROUP BY pode melhorar a performance da consulta, especialmente em grandes volumes de dados. Índices bem construídos também contribuem.

Sempre que a condição de filtro envolver uma função agregada, como SUM(), AVG(), COUNT(), etc., e o agrupamento tiver sido feito, use HAVING.

Ambas as cláusulas DISTINCT e GROUP BY podem remover duplicidade, mas têm propósitos diferentes. DISTINCT remove duplicados diretamente, enquanto GROUP BY agrupa e permite agregar.

— DISTINCT
SELECT DISTINCT id_vendedor FROM VENDAS;

— GROUP BY
SELECT id_vendedor, COUNT(*) FROM VENDAS GROUP BY id_vendedor;

Grave esta regra de ouro:
– Use WHERE para filtrar linhas antes da agregação;
– Use HAVING para filtrar grupos após a agregação;
– Use GROUP BY quando quiser agrupar os dados para aplicar funções agregadas.

Dominar as cláusulas GROUP BY, HAVING e WHERE é essencial para encarar provas de concursos da área de TI com segurança. São temas cobrados com frequência por Consulplan, FGV e Cebraspe, e a clareza entre os momentos de filtragem garante o acerto de muitas questões que parecem complicadas à primeira vista.

Continue firme nos estudos e acompanhe mais dicas aqui no Gran Cursos Online!


Quer ficar por dentro dos concursos públicos abertos e previstos pelo Brasil? Clique nos links abaixo:

CNU 2025 (CONCURSOS NACIONAL UNIFICADO 2)

CONCURSOS 2025

CONCURSOS 2026

CONCURSOS ABERTOS

QUESTÕES DE CONCURSOS

Receba gratuitamente no seu celular as principais notícias do mundo dos concursos. Clique no link abaixo e inscreva-se:

WHATSAPP

TELEGRAM

Por
3 min. de leitura