Questão de Banco de Dados — Consultas e Comandos em SQL — Instituto Consulplan 2023
- Código
- qa537607
- Banca
- Instituto Consulplan
- Órgão
- IF PA
- Ano
- 2023
- Cargo
- ATI ( )
- A

- B

- C

- D





GabaritoD — [imagem]
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.
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.
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.
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.
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.
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.
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