Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2025
Banco de Dados›Consultas e Comandos em SQL
Código
ce417322
Banca
CESPE / CEBRASPE
Órgão
BANRISUL
Ano
2025
Cargo
Tec TI ( )
Em certo banco, há as tabelas clientes e conta. Os dados a seguir foram salvos nessas tabelas no banco de dados. A partir dos dados informados na situação hipotética precedente, assinale a opção em que é apresentada a consulta SQL que exibirá os nomes dos clientes que possuem pelo menos uma conta com saldo superior a R$ 1.000.
ASELECT nome FROM clientes c WHERE EXISTS ( SELECT 1 FROM contas ct WHERE ct.id_cliente = c.id_cliente AND ct.saldo > 1000)
BSELECT nome FROM clientes c WHERE NOT EXISTS ( SELECT * FROM contas ct WHERE ct.id_cliente = c.id_cliente AND ct.saldo < 1000)
CSELECT nome FROM clientes c JOIN contas ct ON c.id_cliente = ct.id_cliente WHERE ct.saldo > 1000
DSELECT DISTINCT nome FROM clientes c JOIN contas ct ON c.id_cliente = ct.id_cliente WHERE ct.saldo >= 1000
ESELECT nome FROM clientes c WHERE EXISTS ( SELECT 1 FROM contas ct WHERE ct.id_cliente = c.id_cliente AND ct.saldo >= 1000)
Revelar gabarito e comentário▾
GabaritoA — SELECT nome
FROM clientes c
WHERE EXISTS (
SELECT 1 FROM contas ct
WHERE ct.id_cliente = c.id_cliente AND ct.saldo > 1000)
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 – Subconsulta correlacionada com EXISTS
Gabarito: letra A. A consulta correta usa uma subconsulta correlacionada com EXISTS, que retorna verdadeiro se existir pelo menos uma conta daquele cliente com saldo superior a R$ 1.000 (condição ct.saldo > 1000). As demais alternativas ou usam o operador de comparação errado (>= em vez de >), ou a lógica invertida (NOT EXISTS com <), ou não eliminam duplicatas quando o cliente tem mais de uma conta qualificada.
O comando EXISTS é um predicado lógico que testa a existência de linhas retornadas por uma subconsulta. Quando usado de forma correlacionada — ou seja, a subconsulta referencia uma coluna da consulta externa (aqui, c.id_cliente) — ele avalia a condição para cada linha da tabela externa. Se a subconsulta retornar ao menos uma linha, o EXISTS é verdadeiro e a linha do cliente entra no resultado. Essa é a forma mais direta e semanticamente correta de responder "clientes que possuem pelo menos uma conta com saldo superior a R$ 1.000".
A pegadinha central desta questão está na comparação de limite: o enunciado pede saldo superior a R$ 1.000, ou seja, saldo > 1000. As alternativas que usam >= 1000 incluem indevidamente contas com saldo exatamente igual a R$ 1.000, o que foge do critério pedido. Além disso, a alternativa B inverte a lógica: ela usa NOT EXISTS com saldo < 1000, o que retornaria clientes que não possuem nenhuma conta com saldo menor que R$ 1.000 — ou seja, clientes cujas contas são todas maiores ou iguais a R$ 1.000, o que não é o que se pede.
Outro ponto importante é a duplicação de resultados. As alternativas C e D usam JOIN, que combina cada conta com seu cliente. Se um cliente tiver duas contas com saldo acima de R$ 1.000, ele aparecerá duas vezes no resultado. A alternativa D tenta corrigir isso com DISTINCT, mas ainda usa >= em vez de >. A alternativa C nem sequer usa DISTINCT, então além do operador errado, geraria nomes repetidos. O EXISTS da alternativa A resolve naturalmente esse problema: como ele apenas testa a existência, cada cliente aparece uma única vez, independentemente de quantas contas qualificadas possua.
Guarde a fronteira entre teste de existência (EXISTS) e junção (JOIN): o primeiro é ideal para consultas do tipo "existe pelo menos um", evitando duplicatas; o segundo combina linhas e pode exigir DISTINCT ou GROUP BY para eliminar repetições. É exatamente nessa distinção que as alternativas se dividem.
Alternativa A — ✅ Correta ⟵ GABARITO
A consulta usa EXISTS com subconsulta correlacionada: para cada cliente c, verifica se existe alguma conta ct com ct.id_cliente = c.id_cliente e ct.saldo > 1000. O operador > atende exatamente ao critério "superior a R$ 1.000". Como o EXISTS apenas testa a existência, não há risco de duplicar o nome do cliente, mesmo que ele tenha várias contas qualificadas. A sintaxe está correta e o resultado é exatamente o pedido.
Alternativa B — ❌ Incorreta
A lógica está invertida. O comando usa NOT EXISTS com a condição ct.saldo < 1000. Isso retornaria os clientes que não possuem nenhuma conta com saldo menor que R$ 1.000 — ou seja, clientes cujas contas são todas com saldo maior ou igual a R$ 1.000. Isso é diferente de "possuir pelo menos uma conta com saldo superior a R$ 1.000". Um cliente com uma conta de R$ 1.000 exatos e outra de R$ 500, por exemplo, seria incluído indevidamente (pois não tem conta com saldo < 1000? na verdade tem a de 500, então seria excluído — mas um cliente com apenas uma conta de R$ 1.000 exatos seria incluído, o que não atende ao critério). A combinação NOT EXISTS + < não corresponde ao que o enunciado pede.
Alternativa C — ❌ Incorreta
Dois problemas: (1) usa JOIN, que combina cada conta com seu cliente — se um cliente tiver duas contas com saldo > 1000, seu nome aparecerá duplicado no resultado, pois não há DISTINCT nem GROUP BY; (2) o operador > está correto, mas a falta de eliminação de duplicatas torna o resultado incorreto em relação ao que se espera (uma lista de nomes, sem repetições). A consulta até retornaria os clientes certos, mas com repetições indevidas.
Alternativa D — ❌ Incorreta
Usa DISTINCT, o que resolve o problema de duplicatas, mas o operador é >= (maior ou igual), enquanto o enunciado pede saldo superior a R$ 1.000. Isso incluiria indevidamente clientes cuja única conta qualificada tem saldo exatamente igual a R$ 1.000. O critério "superior a" exige >, não >=.
Alternativa E — ❌ Incorreta
A estrutura é idêntica à alternativa A (correta), mas o operador é >= em vez de >. Isso incluiria contas com saldo exatamente igual a R$ 1.000, o que foge do critério "superior a R$ 1.000". A diferença de um único caractere (> vs >=) é a armadilha clássica desta questão.
NÃO CAIA NESSA!
A banca troca sutilmente o operador de comparação: o enunciado pede saldo superior a R$ 1.000 (>), mas as alternativas D e E usam >= (maior ou igual), incluindo contas com saldo exatamente igual a R$ 1.000. Além disso, a alternativa B inverte a lógica com NOT EXISTS + <, e as alternativas C e D (mesmo com DISTINCT) usam JOIN, que pode gerar duplicatas. Fique atento: > é estritamente maior; >= inclui o valor limite. Com treino, você enxerga essas trocas de longe 💪.
PEGA ESSA DICA!
Para questões de "pelo menos um" / "existe algum", prefira EXISTS com subconsulta correlacionada — ele testa a existência e evita duplicatas naturalmente. Se usar JOIN, lembre-se de aplicar DISTINCT ou GROUP BY para eliminar repetições. E sempre confira o operador de comparação: > (estritamente maior), >= (maior ou igual), < (estritamente menor), <= (menor ou igual).