Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — FUNDATEC 2024

Banco de DadosBanco 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:Imagem associada para resolução da questãoAcerca 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.
  1. ASelect Municipio, sum(Qnt_produzida_toneladas)From historico_producaoWhen Ano = 2021group by Municipiohaving sum(Qnt_produzida_toneladas) > 500
  2. BList Municipio, sum(Qnt_produzida_toneladas) > 500From historico_producaoWhat Ano = 2021group by Municipio
  3. CSelect Municipio, sum(Qnt_produzida_toneladas)From historico_producaoWhere Ano = 2021group by Municipiohaving sum(Qnt_produzida_toneladas) > 500
  4. DSelect Municipio, sum(Qnt_produzida_toneladas)From historico_producaoWhat Ano = 2021And Qnt_produzida_toneladas > 500group by Municipio
  5. 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 é: FROMWHEREGROUP BYHAVINGSELECTORDER 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.

  1. 1FROM (tabela)
  2. 2WHERE (filtra linhas)
  3. 3GROUP BY (agrupa)
  4. 4HAVING (filtra grupos)
  5. 5SELECT (projeta)
  6. 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.

Gabarito: letra C

Link permanente: /questoes/qg171020