Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FCC 2026

Banco de DadosConsultas e Comandos em SQL
Código
fc142292
Banca
FCC
Órgão
SEFAZ MT
Ano
2026
Cargo
FTE ( )
Em uma consulta para totalizar ICMS por município e retornar apenas municípios cujo total agregado ultrapasse um limite legal, considerando a ordem de avaliação das cláusulas SQL, a cláusula usada para filtrar resultados agregados após o agrupamento é
  1. ADISTINCT, por eliminar automaticamente grupos abaixo do limite.
  2. BSELECT, por aplicar predicados condicionais depois do GROUP BY.
  3. CHAVING, por restringir grupos com base em funções de agregação.
  4. DWHERE, por avaliar condições após a agregação por município.
  5. EORDER BY, por remover grupos que não atendem ao limite ao ordenar.
Revelar gabarito e comentário

GabaritoC — HAVING, por restringir grupos com base em funções de agregação.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL: Ordem de avaliação das cláusulas e filtro de grupos agregados

Gabarito: letra C. A cláusula HAVING é a única que filtra grupos formados pelo GROUP BY com base em funções de agregação (como SUM, AVG, COUNT), sendo aplicada após a agregação. O WHERE, por sua vez, filtra linhas individuais antes do agrupamento — é essa distinção de ordem de avaliação que a questão explora.

A consulta descrita no enunciado — totalizar ICMS por município e retornar apenas os municípios cujo total agregado ultrapasse um limite — exige, em SQL, a combinação de GROUP BY municipio com HAVING SUM(icms) > limite. O GROUP BY agrupa as linhas por município; o SUM(icms) calcula o total de cada grupo; e o HAVING descarta os grupos cujo total não atinge o limite legal. O WHERE não poderia fazer esse filtro, pois é avaliado antes da agregação e não enxerga o resultado do SUM.

A ordem lógica de execução de uma consulta SQL é um dos pontos mais cobrados em provas de banco de dados, justamente porque não coincide com a ordem em que as cláusulas são escritas. O banco executa, conceitualmente, na seguinte sequência:

  1. FROM — define as tabelas de origem;

  2. WHERE — filtra as linhas individuais;

  3. GROUP BY — agrupa as linhas sobreviventes;

  4. HAVING — filtra os grupos formados;

  5. SELECT — projeta as colunas e calcula as expressões;

  6. ORDER BY — ordena o resultado final.

Essa sequência explica por que o WHERE não pode conter funções de agregação (ele roda antes de o SUM existir) e por que o HAVING é a ferramenta certa para filtrar totais agregados. O ORDER BY é a última etapa e apenas ordena, nunca remove linhas ou grupos. O DISTINCT elimina duplicatas de linhas, não grupos abaixo de um limite. E o SELECT projeta colunas, não aplica predicados condicionais.

Um exemplo concreto: imagine uma tabela vendas com colunas municipio e valor_icms. Para listar apenas os municípios cuja soma de ICMS supere R$ 100.000, a consulta seria:

SELECT municipio, SUM(valor_icms) AS total_icms
FROM vendas
GROUP BY municipio
HAVING SUM(valor_icms) > 100000;

O WHERE poderia filtrar, por exemplo, apenas vendas de um determinado período (WHERE data >= '2025-01-01'), mas nunca o total agregado. Essa é a fronteira que separa as duas cláusulas e que as alternativas tentam confundir.

  1. 1FROM
  2. 2WHERE (linhas)
  3. 3GROUP BY
  4. 4HAVING (grupos)
  5. 5SELECT
  6. 6ORDER BY
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

O DISTINCT elimina linhas duplicadas no resultado da consulta, não grupos que não atingem um limite. Ele é usado logo após o SELECT (SELECT DISTINCT municipio FROM vendas) e não tem qualquer relação com filtros sobre funções de agregação. A alternativa confunde o conceito de eliminação de repetições com o de filtro de grupos.

Alternativa B — ❌ Incorreta

O SELECT é a cláusula de projeção: define quais colunas e expressões aparecem no resultado. Ele não aplica predicados condicionais — essa função é do WHERE (para linhas) e do HAVING (para grupos). A alternativa erra ao atribuir ao SELECT uma função de filtragem que ele não possui.

Alternativa C — ✅ Correta ⟵ GABARITO

O HAVING é a cláusula que restringe grupos formados pelo GROUP BY, permitindo condições sobre funções de agregação como SUM, AVG, COUNT, MAX e MIN. Na consulta do enunciado, HAVING SUM(icms) > limite retorna apenas os municípios cujo total agregado ultrapassa o limite legal. É exatamente a função descrita na alternativa.

Alternativa D — ❌ Incorreta

O WHERE filtra linhas individuais antes da agregação, não após. Ele não pode referenciar funções de agregação porque, na ordem de execução, roda antes do GROUP BY e do cálculo dos totais. A alternativa inverte a ordem de avaliação: o WHERE é avaliado antes, não depois, do agrupamento.

Alternativa E — ❌ Incorreta

O ORDER BY apenas ordena o resultado final da consulta (crescente ou decrescente). Ele não remove linhas nem grupos — todo o conjunto retornado pelas etapas anteriores é exibido, apenas em outra ordem. A alternativa atribui ao ORDER BY uma função de filtragem que não existe.

NÃO CAIA NESSA!

A banca explora a confusão clássica entre WHERE e HAVING. O candidato que decora "WHERE filtra" sem entender a ordem de execução tende a marcar a letra D, mas o WHERE atua antes da agregação, sobre linhas individuais. O HAVING é o único que enxerga o resultado do SUM e pode filtrar grupos. Lembre-se: WHERE = linha a linha, antes do GROUP BY; HAVING = grupo a grupo, depois do GROUP BY.

PEGA ESSA DICA!

Para questões de SQL, memorize a ordem lógica de execução: FROMWHEREGROUP BYHAVINGSELECTORDER BY. Se a condição envolve função de agregação (SUM, AVG, COUNT), a cláusula é obrigatoriamente HAVING. Se a condição é sobre uma coluna comum, é WHERE. Essa regra resolve a maioria das questões do tema.

Gabarito: letra C

Link permanente: /questoes/fc142292