Questão de Banco de Dados — Banco de Dados Relacionais — FUNDATEC 2024
Banco de Dados›Banco de Dados Relacionais
Código
qg171020
Banca
FUNDATEC
Órgão
Prefeitura de Cruz Alta - RS
Ano
2024
Nível
Médio
Cargo
Técnico em Informática
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: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_producaoWhen Ano = 2021group by Municipiohaving sum(Qnt_produzida_toneladas) > 500
BList Municipio, sum(Qnt_produzida_toneladas) > 500From historico_producaoWhat Ano = 2021group by Municipio
CSelect Municipio, sum(Qnt_produzida_toneladas)From historico_producaoWhere Ano = 2021group by Municipiohaving sum(Qnt_produzida_toneladas) > 500
DSelect Municipio, sum(Qnt_produzida_toneladas)From historico_producaoWhat Ano = 2021And Qnt_produzida_toneladas > 500group by Municipio
ESelect Municipio, sum(Qnt_produzida_toneladas)From historico_producaoorder 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”.
Consulta SQL com agregação e filtro por grupo
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. As demais alternativas contêm erros de sintaxe (palavras-chave inexistentes como When, What, List) ou de lógica (filtro no lugar errado, ausência de agrupamento).
A consulta pedida tem um objetivo claro: listar somente os municípios cuja produção total de frutas em 2021 ultrapassou 500 toneladas. Isso exige duas etapas de filtragem: primeiro, restringir os registros ao ano de 2021 (filtro sobre linhas individuais); depois, agrupar os registros por município e aplicar uma condição sobre o resultado da agregação (a soma das toneladas). A linguagem SQL separa esses dois momentos com cláusulas distintas: WHERE filtra linhas antes do agrupamento, enquanto HAVING filtra grupos depois da agregação. Essa distinção é o coração da questão — e é nela que as alternativas se dividem.
Vamos entender cada parte da consulta correta:
SELECT Municipio, sum(Qnt_produzida_toneladas) — projeta o nome do município e a soma das toneladas produzidas.
FROM historico_producao — indica a tabela de origem.
WHERE Ano = 2021 — seleciona apenas as linhas do ano de 2021 (filtro de linha).
GROUP BY Municipio — agrupa as linhas selecionadas por município, permitindo que a função SUM calcule o total por grupo.
HAVING sum(Qnt_produzida_toneladas) > 500 — filtra os grupos cuja soma ultrapassa 500 toneladas (filtro de grupo).
A ordem lógica de execução no SQL é: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. Isso significa que o WHERE é aplicado antes do agrupamento, e o HAVING depois. Usar WHERE para filtrar a soma (como na alternativa D) não funciona, porque a soma ainda não foi calculada naquele ponto — o WHERE não pode referenciar funções de agregação. Já o HAVING só pode ser usado em conjunto com GROUP BY (ou em consultas agregadas), pois opera sobre os grupos formados.
Um exemplo concreto: suponha que a tabela tenha registros de três municípios — Porto Alegre (2021: 300 t, 2021: 250 t), Caxias do Sul (2021: 400 t) e Pelotas (2020: 600 t). A consulta correta primeiro filtra Ano = 2021, descartando Pelotas; depois agrupa por município, somando as toneladas de Porto Alegre (550 t) e Caxias do Sul (400 t); por fim, o HAVING mantém apenas Porto Alegre (550 > 500). O resultado seria uma linha: Porto Alegre, 550.
A pegadinha da banca está em trocar WHERE por HAVING (ou vice-versa) e em usar palavras-chave inventadas (When, What, List) que não existem no SQL padrão. O candidato que decora a sintaxe sem entender a semântica pode até reconhecer a estrutura certa, mas a banca explora justamente a confusão entre filtrar linhas e filtrar grupos.
Guarde a fronteira: WHERE filtra linhas, HAVING filtra grupos. É exatamente nessa distinção que as alternativas se separam.
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 em vez de Where. A palavra-chave WHEN existe no SQL, mas apenas em expressões CASE (por exemplo, CASE WHEN condicao THEN ...), não como cláusula de filtro de consulta. Além disso, a estrutura geral está correta (SELECT, FROM, GROUP BY, HAVING), mas o erro de sintaxe invalida a consulta.
Alternativa B — ❌ Incorreta
Apresenta dois erros graves: usa List (palavra inexistente no SQL — o comando correto é SELECT) e What (também inexistente; o correto é WHERE). Além disso, coloca a condição sum(Qnt_produzida_toneladas) > 500 diretamente na lista de seleção, o que não é a sintaxe válida para filtrar grupos — isso deveria estar na cláusula HAVING.
Alternativa C — ✅ Correta ⟵ GABARITO
É a única que combina corretamente WHERE (filtro de linhas por ano), GROUP BY (agrupamento por município) e HAVING (filtro sobre a soma agregada). A ordem das cláusulas está correta e a sintaxe é válida no SQL padrão.
Alternativa D — ❌ Incorreta
Usa What em vez de Where (erro de sintaxe). Além disso, coloca a condição Qnt_produzida_toneladas > 500 na cláusula WHERE, o que filtraria linhas individuais com produção acima de 500 toneladas, e não municípios cuja soma ultrapasse 500. O correto seria usar HAVING sum(Qnt_produzida_toneladas) > 500 após o GROUP BY. A consulta como está nem sequer agrupa corretamente (o GROUP BY está no final, mas sem HAVING).
Alternativa E — ❌ Incorreta
Usa order By (ordenação) com uma condição Qnt_produzida_toneladas > 500 que não é uma expressão de ordenação válida. Além disso, não há WHERE para filtrar o ano de 2021, não há GROUP BY para agrupar por município e não há HAVING para filtrar a soma. A consulta está completamente fora do que se pede.
NÃO CAIA NESSA!
A banca troca WHERE por HAVING e vice-versa, e ainda inventa palavras-chave (When, What, List) para confundir quem não domina a sintaxe. Lembre-se: WHERE filtra linhas antes do agrupamento; HAVING filtra grupos depois da agregação. Se a condição envolve uma função de agregação (SUM, COUNT, AVG), ela só pode estar no HAVING.
PEGA ESSA DICA!
Na prova, ao ver uma consulta com GROUP BY, verifique se a condição de filtro está na cláusula certa: se menciona uma coluna normal (ex.: Ano = 2021), deve estar no WHERE; se menciona uma agregação (ex.: SUM(...) > 500), deve estar no HAVING. Essa checagem rápida elimina a maioria dos distratores.