Questão nº 53
Questão de Tecnologia da Informação · FCC DPE-AM 2017 (nº 53)
Seja a tabela Vendas de um banco de dados relacional:
Vendas (ID, Nome-Item, Valor, Descrição, Fabricante)
O comando SQL-ANSI para obter o nome do fabricante e o valor médio dos itens de cada fabricante, apenas no caso de valores médios superiores a R$ 100,00 é:
- ASELECT Fabricante, MED (Valor)
FROM Vendas
WHERE MED (Valor) > 100.00 - BSELECT Fabricante, AVG (Valor)
FROM Vendas
GROUP BY Valor
WHERE AVG (Valor) > 100.00 - CSELECT Fabricante, MED (Valor)
FROM Vendas
GROUPING Fabricante WITH AVG (Valor) > 100.00 - DSELECT Fabricante, AVG (Valor)
FROM Vendas
GROUP BY Fabricante
HAVING AVG (Valor) > 100.00 (alternativa correta) - ESELECT Fabricante, AVG (Valor)
FROM Vendas
JOIN Fabricante AND AVG (Valor) > 100.00
Resposta comentada
Gabarito Alternativa D
Para agrupar dados e fazer cálculos (como média, soma, contagem) para cada grupo, usamos o comando GROUP BY. Se quisermos filtrar esses grupos com base no resultado desses cálculos, usamos o comando HAVING.
- (A) Incorreta: A função
MEDnão é padrão SQL para média (o correto éAVG). Além disso, a cláusulaWHEREnão pode filtrar diretamente resultados de funções de agregação (MED(Valor)). - (B) Incorreta: A cláusula
GROUP BY Valoragruparia por valor do item, não por fabricante. O correto seriaGROUP BY Fabricante. A cláusulaWHEREnão pode filtrar resultados de funções de agregação (AVG(Valor)), para isso usa-seHAVING. Armadilha da banca: Esta alternativa é tentadora porque usaAVGe tenta filtrar com a condição, mas erra noGROUP BY(agrupando pelo item em vez do fabricante) e, crucialmente, usaWHEREem vez deHAVINGpara filtrar o resultado da agregação. Lembre-se:WHEREfiltra linhas individuais antes do agrupamento;HAVINGfiltra grupos depois do agrupamento e da agregação. - (C) Incorreta: A função
MEDnão é padrão SQL para média. A sintaxeGROUPING Fabricante WITH AVG (Valor) > 100.00não é um comando SQL-ANSI válido para agrupar e filtrar. - (D) Correta: O comando
SELECT Fabricante, AVG (Valor)seleciona o nome do fabricante e calcula a média dos valores.FROM Vendasespecifica a tabela.GROUP BY Fabricanteagrupa os resultados por fabricante, permitindo queAVG(Valor)calcule a média para cada um.HAVING AVG (Valor) > 100.00filtra esses grupos, mostrando apenas os fabricantes cuja média de valor é superior a R$ 100,00. Esta é a sintaxe correta e atende a todos os requisitos da questão. - (E) Incorreta: A sintaxe
JOIN Fabricanteestá incompleta e incorreta, pois não há uma cláusulaONpara definir a condição de junção. A parteAND AVG (Valor) > 100.00está sintaticamente fora de lugar, não sendo parte de umWHEREouHAVINGválido.
Fonte: FCC DPE-AM 2017 Analista em Gestão Especializado em Tecnologia da Informação de Defensoria - Analista de Banco de Dados (Caderno Tipo 001). Reproduzida para fins de estudo.