Baixe o material de estudo
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:
TELEGRAM
Fonte: Gran Cursos Online