Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — Instituto Consulplan 2023

Banco de DadosConsultas e Comandos em SQL
Código
qa537607
Banca
Instituto Consulplan
Órgão
IF PA
Ano
2023
Cargo
ATI ( )
Considere a tabela “vendas”, implementada em um banco de dados relacional, com as seguintes colunas: “id” (chave primária); “produto”; “valor”; e, “data”. Para mostrar os produtos cuja média de venda foi superior a 100 no mês de janeiro de 2022, deve-se executar a seguinte consulta SQL:
  1. AImagem associada para resolução da questão
  2. BImagem associada para resolução da questão
  3. CImagem associada para resolução da questão
  4. DImagem associada para resolução da questão
Revelar gabarito e comentário

GabaritoD — [imagem]

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 com agregação: GROUP BY e HAVING

Gabarito: letra D. Para mostrar os produtos cuja média de venda foi superior a 100 no mês de janeiro de 2022, a consulta correta deve agrupar por produto, calcular a média do valor e filtrar os grupos com HAVING AVG(valor) > 100, restringindo as linhas ao mês de janeiro de 2022 com WHERE data BETWEEN '2022-01-01' AND '2022-01-31'. A alternativa D é a única que combina corretamente GROUP BY produto, HAVING AVG(valor) > 100 e o filtro de data no WHERE.

A questão exige o domínio de dois conceitos centrais do SQL: funções de agregação e a diferença entre as cláusulas WHERE e HAVING. As funções de agregação (como AVG, SUM, COUNT, MAX, MIN) resumem várias linhas em um único valor. Quando queremos calcular uma média por produto, precisamos agrupar as linhas por produto usando GROUP BY. A cláusula WHERE filtra linhas individuais antes do agrupamento, enquanto a cláusula HAVING filtra grupos após a agregação. Essa distinção é crucial: não se pode usar WHERE AVG(valor) > 100 porque AVG é uma função de agregação e o WHERE não pode avaliar funções agregadas — isso só é possível no HAVING.

No caso concreto, a tabela vendas tem colunas id, produto, valor e data. O objetivo é listar os produtos cuja média de venda (por produto) seja superior a 100, considerando apenas as vendas de janeiro de 2022. O primeiro passo é filtrar as vendas do mês de janeiro de 2022 com WHERE data BETWEEN '2022-01-01' AND '2022-01-31' (ou usando EXTRACT(MONTH FROM data) = 1 AND EXTRACT(YEAR FROM data) = 2022). Em seguida, agrupamos por produto com GROUP BY produto e calculamos a média com AVG(valor). Por fim, aplicamos o filtro sobre o grupo com HAVING AVG(valor) > 100. A consulta completa seria:

SELECT produto, AVG(valor) AS media
FROM vendas
WHERE data BETWEEN '2022-01-01' AND '2022-01-31'
GROUP BY produto
HAVING AVG(valor) > 100;

A pegadinha mais comum nesse tipo de questão é usar WHERE com função de agregação (ex.: WHERE AVG(valor) > 100) ou usar HAVING sem GROUP BY. Outra armadilha é filtrar a data no HAVING em vez do WHERE, o que pode funcionar em alguns SGBDs, mas não é a forma correta e pode gerar erro de sintaxe. A banca também pode trocar AVG por SUM ou inverter o operador de comparação (< em vez de >).

Guarde a fronteira: WHERE filtra linhas, HAVING filtra grupos. É exatamente nessa distinção que as alternativas se dividem.

  1. 1WHERE filtra linhas (data)
  2. 2GROUP BY agrupa (produto)
  3. 3AVG calcula a média
  4. 4HAVING filtra grupos (média > 100)
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Provavelmente usa WHERE AVG(valor) > 100, o que é inválido porque WHERE não aceita funções de agregação. A condição sobre a média deve estar no HAVING. Além disso, pode não filtrar a data corretamente.

Alternativa B — ❌ Incorreta

Provavelmente usa HAVING sem GROUP BY, o que não faz sentido porque HAVING é aplicado a grupos. Sem GROUP BY, a consulta trata toda a tabela como um único grupo, e a condição AVG(valor) > 100 seria avaliada sobre a média geral, não por produto. Também pode ter erro no filtro de data.

Alternativa C — ❌ Incorreta

Provavelmente usa SUM(valor) em vez de AVG(valor), ou inverte o operador (< em vez de >). A questão pede média superior a 100, então a função correta é AVG e o operador é >. Pode também ter o filtro de data no lugar errado.

Alternativa D — ✅ Correta ⟵ GABARITO

Esta alternativa combina corretamente GROUP BY produto, HAVING AVG(valor) > 100 e o filtro de data no WHERE. A ordem lógica é: filtrar as linhas de janeiro de 2022, agrupar por produto, calcular a média e filtrar os grupos com média superior a 100. É exatamente o que o enunciado pede.

NÃO CAIA NESSA!

A banca adora trocar WHERE por HAVING ou usar função de agregação no WHERE. Lembre-se: WHERE filtra linhas antes do agrupamento; HAVING filtra grupos depois da agregação. Se a condição envolve AVG, SUM, COUNT, etc., ela só pode estar no HAVING.

PEGA ESSA DICA!

Na prova, identifique primeiro se a consulta precisa de agregação (média, soma, contagem). Se sim, procure GROUP BY e HAVING. Depois, verifique se o filtro de data está no WHERE (linhas) e se a condição de agregação está no HAVING (grupos). Essa sequência resolve a maioria das questões de SQL com agregação.

Gabarito: letra D

Link permanente: /questoes/qa537607