Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2024
Banco de Dados›Consultas e Comandos em SQL
Código
qa630762
Banca
FUNDATEC
Órgão
Pref Cruz Alta
Ano
2024
Cargo
Tec ( )
Com base nos Dados Abertos do governo do estado (dados.rs.gov.br), referente ao tema agricultura, foi possível criar a tabela “historico_producao” em um banco de dados relacional, conforme abaixo:
Municipio
Produto
Ano
Qnt_produzida_toneladas
Arroio do Tigre
Goiaba
2021
22
Cotiporã
Goiaba
2021
8
Dom Feliciano
Goiaba
2021
11
Arroio do Tigre
Laranja
2021
600
Charqueadas
Laranja
2021
100
Cotiporã
Laranja
2021
938
Dom Feliciano
Laranja
2021
720
Estrela Velha
Laranja
2021
319
Fortaleza dos Valos
Laranja
2021
285
Arroio do Tigre
Banana
2021
64
Cotiporã
Banana
2021
60
Dom Feliciano
Banana
2020
12
Acerca das informações presentes na tabela acima, assinale a alternativa que contém a consulta SQL correta, considerando que o objetivo da query é listar somente os municípios que tiveram uma produção maior do que 500 toneladas de frutas no ano de 2021.
ASelect Municipio, sum(Qnt_produzida_toneladas) From historico_producao When Ano = 2021 group by Municipio having sum(Qnt_produzida_toneladas) > 500
BList Municipio, sum(Qnt_produzida_toneladas) > 500 From historico_producao What Ano = 2021 group by Municipio
CSelect Municipio, sum(Qnt_produzida_toneladas) From historico_producao Where Ano = 2021 group by Municipio having sum(Qnt_produzida_toneladas) > 500
DSelect Municipio, sum(Qnt_produzida_toneladas) From historico_producao What Ano = 2021 And Qnt_produzida_toneladas > 500 group by Municipio
ESelect Municipio, sum(Qnt_produzida_toneladas) From historico_producao order By Qnt_produzida_toneladas > 500
Revelar gabarito e comentário▾
GabaritoC — Select Municipio, sum(Qnt_produzida_toneladas)
From historico_producao
Where Ano = 2021
group by Municipio
having sum(Qnt_produzida_toneladas) > 500
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”.
Consultas SQL: agrupamento e filtro com HAVING
Gabarito: letra C. A consulta correta usa SELECT com SUM, FROM, WHERE para filtrar o ano, GROUP BY para agrupar por município e HAVING para filtrar os grupos com soma superior a 500 toneladas — exatamente a estrutura da alternativa C.
A ideia por trás
A questão testa o domínio da ordem lógica de execução das cláusulas SQL e a diferença entre filtrar linhas e filtrar grupos. Quando o objetivo é somar a produção de cada município e depois manter apenas os municípios cuja soma ultrapassa 500 toneladas, precisamos de duas etapas de filtragem:
Filtrar as linhas que interessam (ano de 2021) — isso é feito com WHERE.
Agrupar as linhas por município — GROUP BY Municipio.
Calcular a soma da produção para cada grupo — SUM(Qnt_produzida_toneladas).
Filtrar os grupos cuja soma é maior que 500 — isso é feito com HAVING.
O HAVING é a cláusula que permite filtrar o resultado de uma função de agregação (como SUM, COUNT, AVG). O WHERE não pode ser usado para filtrar agregados, pois ele é aplicado antes do agrupamento, sobre as linhas individuais.
Vamos aplicar isso aos dados da tabela. Para o ano de 2021, as produções por município são:
Dom Feliciano: Goiaba (11) + Laranja (720) = 731 toneladas (a Banana é de 2020, então fica de fora)
Charqueadas: Laranja (100) = 100 toneladas
Estrela Velha: Laranja (319) = 319 toneladas
Fortaleza dos Valos: Laranja (285) = 285 toneladas
Com o filtro HAVING SUM(...) > 500, o resultado traria apenas Arroio do Tigre, Cotiporã e Dom Feliciano.
A ordem de escrita no SQL é SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY, mas a ordem de execução é diferente: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. É por isso que o HAVING consegue filtrar o resultado do SUM, que é calculado no SELECT.
A pegadinha da banca está em trocar WHERE por WHEN ou WHAT (palavras que não existem no SQL) e em usar HAVING sem GROUP BY ou WHERE sem agregação. A alternativa D, por exemplo, tenta filtrar a quantidade diretamente no WHERE, o que descartaria as linhas individuais antes da soma — o que não atende ao objetivo de somar tudo e depois filtrar.
Guarde a fronteira: WHERE filtra linhas, HAVING filtra grupos. É exatamente nessa distinção que as alternativas se dividem.
1FROM (tabela)
2WHERE (filtra linhas)
3GROUP BY (agrupa)
4HAVING (filtra grupos)
5SELECT (projeta)
6ORDER BY (ordena)
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Usa When Ano = 2021 — WHEN não é uma cláusula SQL válida para filtrar linhas; o correto é WHERE. A estrutura de agrupamento e HAVING está certa, mas o erro na palavra-chave invalida a consulta.
Alternativa B — ❌ Incorreta
Começa com List (não existe em SQL, o correto é SELECT) e usa What no lugar de WHERE. Além disso, não há HAVING para filtrar o resultado da soma — a condição > 500 está solta na projeção, o que é sintaticamente inválido.
Alternativa C — ✅ Correta ⟵ GABARITO
Apresenta a estrutura completa e correta: SELECT com SUM, FROM com a tabela, WHERE filtrando o ano de 2021, GROUP BY agrupando por município e HAVING filtrando os grupos com soma superior a 500 toneladas. É a única que atende ao objetivo da query.
Alternativa D — ❌ Incorreta
Usa What no lugar de WHERE (erro sintático) e aplica o filtro Qnt_produzida_toneladas > 500 no WHERE, ou seja, antes da soma. Isso descartaria as linhas individuais com produção menor que 500, e a soma por município ficaria incorreta — por exemplo, Arroio do Tigre teria apenas a Laranja (600) somada, ignorando Goiaba e Banana.
Alternativa E — ❌ Incorreta
Usa order By sem GROUP BY e sem HAVING. A condição Qnt_produzida_toneladas > 500 está na cláusula ORDER BY, que serve apenas para ordenar, não para filtrar. A consulta não agrupa nem soma, então não atende ao objetivo.