Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165213
Banca
FGV
Órgão
TJ AP
Ano
2024
Cargo
AJ ( )
Observe a estrutura da tabela “Cliente” abaixo: CREATE TABLE cliente ( cliente_ID NUMBER(12) PRIMARY KEY, cidade VARCHAR2(50) NOT NULL, limite_credito NUMBER(13,2) DEFAULT 0 ); Com o objetivo de gerar um relatório que mostre o limite de crédito médio para clientes em “Sao Paulo” e “Belo Horizonte”, a consulta a ser executada é:
ASELECT cidade, AVG(NVL(limite_credito,0)) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE');
BSELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY cidade;
CSELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY cliente_ID;
DSELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY cidade, limite_credito;
ESELECT cidade, AVG(limite_credito) FROM cliente WHERE cidade IN ('SAO PAULO','BELO HORIZONTE') GROUP BY limite_credito, cidade;
Revelar gabarito e comentário▾
GabaritoB — SELECT cidade, AVG(limite_credito) FROM cliente
WHERE cidade IN ('SAO PAULO','BELO HORIZONTE')
GROUP BY cidade;
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 e agrupamento
Gabarito: letra B. A consulta correta deve calcular a média do limite de crédito agrupada por cidade, filtrando apenas as cidades 'SAO PAULO' e 'BELO HORIZONTE' — exatamente o que a alternativa B faz com GROUP BY cidade. As demais alternativas erram ao agrupar por colunas que não estão na projeção (como cliente_ID ou limite_credito), o que viola a regra do SQL de que toda coluna não agregada no SELECT deve aparecer no GROUP BY.
A questão cobra o uso correto das funções de agregação (AVG, COUNT, SUM, MAX, MIN) combinadas com a cláusula GROUP BY. Quando queremos um valor agregado (média, soma, contagem) para cada grupo de linhas — aqui, para cada cidade — precisamos agrupar os registros pela coluna que define o grupo. A função AVG(limite_credito) calcula a média dos valores da coluna limite_credito dentro de cada grupo formado pelo GROUP BY cidade.
A regra fundamental é: toda coluna que aparece no SELECT e não está dentro de uma função de agregação deve estar listada no GROUP BY. Se você agrupar por uma coluna que não está no SELECT (como cliente_ID), o resultado não faz sentido — cada grupo seria formado por um único cliente, e a média seria calculada por cliente, não por cidade. Além disso, agrupar por limite_credito junto com cidade criaria um grupo para cada combinação distinta de cidade e limite, fragmentando os dados e produzindo médias por faixa de limite, não por cidade.
Na prática, imagine que a tabela cliente tenha 3 clientes em 'SAO PAULO' com limites 100, 200 e 300, e 2 em 'BELO HORIZONTE' com limites 400 e 500. A consulta correta retornaria:
cidade
AVG(limite_credito)
SAO PAULO
200
BELO HORIZONTE
450
Se agruparmos por cliente_ID, cada cliente vira um grupo separado, e a média de cada grupo é o próprio limite — o relatório não teria a média por cidade. Se agruparmos por limite_credito, cada valor distinto vira um grupo, e a média de cada grupo é o próprio valor — novamente sem sentido para o relatório.
A pegadinha da banca está em trocar a coluna do GROUP BY: em vez de agrupar pela coluna que aparece no SELECT (cidade), as alternativas erradas agrupam por colunas que não estão na projeção, o que quebra a lógica do agrupamento. A alternativa A ainda erra ao omitir o GROUP BY completamente, o que faria a consulta retornar apenas uma linha com a média geral, sem separar por cidade.
Guarde a regra de ouro: no SELECT, toda coluna não agregada deve estar no GROUP BY — é exatamente nesse critério que as alternativas se dividem.
Alternativa A — ❌ Incorreta
Falta a cláusula GROUP BY cidade. Sem ela, a consulta retorna apenas uma linha com a média geral de todos os clientes das duas cidades, não a média por cidade. Além disso, a coluna cidade aparece no SELECT sem agregação e sem GROUP BY, o que é inválido na maioria dos bancos (e semanticamente errado).
Alternativa B — ✅ Correta ⟵ GABARITO
A consulta filtra as cidades desejadas com WHERE cidade IN ('SAO PAULO','BELO HORIZONTE'), agrupa por cidade com GROUP BY cidade, e calcula a média do limite de crédito com AVG(limite_credito). A coluna cidade no SELECT está no GROUP BY, e a coluna agregada AVG(limite_credito) não precisa estar — exatamente a sintaxe correta.
Alternativa C — ❌ Incorreta
Agrupa por cliente_ID, que não está no SELECT. Isso criaria um grupo para cada cliente, e a média de cada grupo seria o próprio limite do cliente — não a média por cidade. A coluna cidade no SELECT não está no GROUP BY, violando a regra.
Alternativa D — ❌ Incorreta
Agrupa por cidade, limite_credito. Isso cria um grupo para cada combinação distinta de cidade e limite, fragmentando os dados. A média seria calculada por faixa de limite dentro de cada cidade, não a média geral por cidade. A coluna limite_credito não deveria estar no GROUP BY porque ela é usada na função de agregação.
Alternativa E — ❌ Incorreta
Agrupa por limite_credito, cidade — a mesma lógica da D, apenas com a ordem invertida. O resultado é o mesmo: grupos por combinação de cidade e limite, não por cidade. A coluna limite_credito não deveria estar no GROUP BY.
NÃO CAIA NESSA!
A banca troca a coluna do GROUP BY para confundir: em vez de agrupar pela coluna que aparece no SELECT (cidade), as alternativas erradas agrupam por cliente_ID ou limite_credito. Lembre-se: a coluna do GROUP BY deve ser a mesma que define o grupo no relatório — aqui, a cidade. Com treino, você enxerga essa troca de longe 💪
PEGA ESSA DICA!
Na prova, verifique sempre se toda coluna não agregada do SELECT está no GROUP BY. Se a consulta pede uma média por categoria, o GROUP BY deve conter exatamente a coluna da categoria. Elimine as alternativas que agrupam por colunas fora da projeção.