Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2025
Banco de Dados›SQL
Código
ce195346
Banca
CESPE / CEBRASPE
Órgão
BANRISUL
Ano
2025
Nível
Superior
Cargo
Técnico em Tecnologia da Informação II - Área: Administração de Banco de Dados
Em um sistema de gestão bancária, pretende-se identificar os clientes que possuem saldo total (somadas todas as suas contas) superior à média dos saldos das contas da agência em que cada conta está vinculada. Nesse sistema, as tabelas clientes e contas foram criadas pelos comandos a seguir.CREATE TABLE clientes (id_cliente INT PRIMARY KEY,nome VARCHAR(50));CREATE TABLE contas (id_conta INT PRIMARY KEY,id_cliente INT,id_agencia INT,saldo NUMERIC(10,2),FOREIGN KEY (id_cliente) REFERENCESclientes(id_cliente))Considerando o uso de subconsulta correlacionada para o atendimento da demanda, assinale a opção que corresponde à consulta SQL que retornará o que se pretende na situação hipotética precedente.
BSELECT c.nomeFROM clientes cJOIN contas ct ON c.id_cliente = ct.id_clienteWHERE ct.saldo > (SELECT AVG(saldo) FROM contas WHEREid_agencia = ct.id_agencia)
CSELECT nomeFROM clientesWHERE id_cliente IN (SELECT id_clienteFROM contasGROUP BY id_clienteHAVING SUM(saldo) > (SELECT AVG(saldo) FROM contas ))
DSELECT c.nomeFROM clientes cJOIN contas ct ON c.id_cliente = ct.id_clienteWHERE ct.saldo > ALL (SELECT saldo FROM contas WHERE id_agencia =ct.id_agencia)
ESELECT c.nomeFROM clientes cJOIN contas ct ON c.id_cliente = ct.id_clienteWHERE (SELECT SUM(saldo) FROM contas WHEREid_cliente = c.id_cliente) > (SELECT MAX(saldo) FROM contas WHEREid_agencia = ct.id_agencia)
Revelar gabarito e comentário▾
GabaritoA — SELECT DISTINCT c.nome
FROM clientes c
JOIN contas ct ON c.id_cliente = ct.id_cliente WHERE
( SELECT SUM(ct2.saldo)
FROM contas ct2
WHERE ct2.id_cliente = ct.id_cliente
) > (
SELECT AVG(ct3.saldo)
FROM contas ct3
WHERE ct3.id_agencia = ct.id_agencia)
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”.
SQL: Subconsultas correlacionadas – Identificar clientes com saldo total acima da média da agência
Gabarito: letra A. A consulta correta utiliza duas subconsultas correlacionadas: uma para somar todos os saldos de um mesmo cliente (SUM(ct2.saldo) por id_cliente) e outra para calcular a média dos saldos da agência da conta em questão (AVG(ct3.saldo) por id_agencia). A condição WHERE (subconsulta1) > (subconsulta2) filtra as contas cujo cliente tenha saldo total superior à média da agência, e DISTINCT evita duplicatas de clientes com múltiplas contas.
A banca testa o entendimento de subconsulta correlacionada e a diferença entre comparar saldo individual versus total agregado por cliente. A pegadinha está na alternativa B, que compara o saldo de cada conta individualmente, e não a soma do cliente.
Alternativa A — ✅ Correta ⟵ GABARITO
SELECT DISTINCT c.nome
FROM clientes c
JOIN contas ct ON c.id_cliente = ct.id_cliente
WHERE (
SELECT SUM(ct2.saldo)
FROM contas ct2
WHERE ct2.id_cliente = ct.id_cliente
) > (
SELECT AVG(ct3.saldo)
FROM contas ct3
WHERE ct3.id_agencia = ct.id_agencia
)
A primeira subconsulta (SUM) é correlacionada com ct.id_cliente, somando os saldos de todas as contas do mesmo cliente.
A segunda subconsulta (AVG) é correlacionada com ct.id_agencia, calculando a média de saldos de todas as contas da mesma agência.
O DISTINCT garante que cada cliente apareça uma vez, mesmo que tenha várias contas que satisfaçam a condição.
Resultado: Retorna exatamente os clientes cujo saldo total (todas as contas) é maior que a média da agência onde cada conta está vinculada.
Alternativa B — ❌ Incorreta
WHERE ct.saldo > (SELECT AVG(saldo) FROM contas WHERE id_agencia = ct.id_agencia)
Compara o saldo individual de cada conta com a média da agência. Se o cliente tiver duas contas, ambas com saldo baixo, mesmo que a soma seja alta, nenhuma conta individualmente supera a média, e o cliente não seria retornado.
Alternativa C — ❌ Incorreta
HAVING SUM(saldo) > (SELECT AVG(saldo) FROM contas)
Compara a soma do cliente com a média geral de todas as contas (de todas as agências), não com a média da agência específica. Ignora o vínculo por agência.
Alternativa D — ❌ Incorreta
WHERE ct.saldo > ALL (SELECT saldo FROM contas WHERE id_agencia = ct.id_agencia)
Compara o saldo individual com todos os saldos da agência (deveria ser maior que o maior). Além de ser por conta, usa > ALL que exige que o saldo seja maior que o máximo, não a média.
Alternativa E — ❌ Incorreta
WHERE (SELECT SUM(saldo) FROM contas WHERE id_cliente = c.id_cliente) > (SELECT MAX(saldo) FROM contas WHERE id_agencia = ct.id_agencia)
A primeira subconsulta está correta (soma do cliente), mas a segunda usa MAX em vez de AVG. A condição exige que a soma do cliente seja maior que o maior saldo da agência, o que é muito mais restritivo e diferente da média.
NÃO CAIA NESSA!
A banca explora a confusão entre saldo individual e saldo total do cliente. Alternativas como B e D parecem corretas à primeira vista, mas comparam uma conta isolada, não o agregado. Lembre-se: o enunciado pede “saldo total (somadas todas as suas contas)”, portanto a subconsulta deve usar SUM agrupado por cliente.
PEGA ESSA DICA!
Em consultas com subconsultas correlacionadas, desenhe mentalmente o fluxo: para cada linha da consulta externa, execute a subconsulta interna. Verifique se os aliases e as correlações estão ligando as colunas certas. No caso, ct2.id_cliente = ct.id_cliente e ct3.id_agencia = ct.id_agencia.