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

Baixe o material de estudo



baixar curso online

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:

CONCURSOS 2025

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

Fonte: Gran Cursos Online

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



Baixar video aula

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Sair da versão mobile