Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2025
Banco de Dados›SQL
Código
ce195347
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 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.
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 para verificar a existência de pelo menos uma conta com saldo superior a R$ 1.000 para cada cliente — exatamente o que o enunciado pede. As demais alternativas ou usam o operador de comparação errado (<, >=), ou não eliminam duplicatas, ou aplicam a condição de forma incorreta.
A questão testa o domínio de subconsultas correlacionadas e do operador EXISTS no SQL. Uma subconsulta correlacionada é aquela que referencia colunas da consulta externa — no caso, c.id_cliente — e é avaliada para cada linha da tabela externa. O EXISTS retorna verdadeiro se a subconsulta retornar pelo menos uma linha, o que é perfeito para verificar a existência de um registro que atenda a uma condição, sem se preocupar com duplicatas.
O enunciado pede clientes que possuam pelo menos uma conta com saldo superior a R$ 1.000. A palavra-chave é "superior a", que em SQL é representada pelo operador >. Portanto, a condição correta é ct.saldo > 1000. Qualquer alternativa que use >= (maior ou igual) incluiria contas com saldo exatamente igual a R$ 1.000, o que não atende ao requisito. Já o uso de < (menor que) inverte completamente a lógica.
Outro ponto crucial é a duplicidade de resultados. Se usarmos um JOIN simples (como na alternativa C), um cliente com múltiplas contas com saldo > 1000 apareceria várias vezes no resultado. Para evitar isso, seria necessário SELECT DISTINCT (como na alternativa D), mas essa alternativa usa >= em vez de >, o que a torna incorreta. A alternativa A, com EXISTS, naturalmente não gera duplicatas, pois apenas verifica a existência.
Vamos analisar cada alternativa em detalhes.
Alternativa A — ✅ Correta ⟵ GABARITO
Esta consulta está correta. Ela usa uma subconsulta correlacionada com EXISTS para verificar se existe pelo menos uma conta (SELECT 1) cujo id_cliente corresponde ao cliente externo e cujo saldo é maior que 1000 (ct.saldo > 1000). O EXISTS retorna verdadeiro se a subconsulta retornar qualquer linha, garantindo que apenas clientes com pelo menos uma conta nessa condição sejam listados. Além disso, como o EXISTS apenas testa a existência, não há risco de duplicação de nomes no resultado.
Alternativa B — ❌ Incorreta
Esta alternativa usa NOT EXISTS com a condição ct.saldo < 1000. Isso retornaria os clientes que não possuem nenhuma conta com saldo menor que 1000, ou seja, clientes cujas contas têm saldo maior ou igual a 1000. Isso incluiria clientes com saldo exatamente igual a 1000 (que não deveriam ser incluídos) e excluiria clientes que têm uma conta com saldo > 1000 e outra com saldo < 1000 (que deveriam ser incluídos). A lógica está completamente invertida.
Alternativa C — ❌ Incorreta
Esta alternativa usa um JOIN simples com a condição ct.saldo > 1000. O problema é que, se um cliente tiver mais de uma conta com saldo > 1000, ele aparecerá mais de uma vez no resultado, gerando duplicatas. O enunciado pede os nomes dos clientes, sem repetição. Para corrigir, seria necessário SELECT DISTINCT, o que não é feito aqui.
Alternativa D — ❌ Incorreta
Esta alternativa usa SELECT DISTINCT e JOIN com a condição ct.saldo >= 1000. O uso de >= (maior ou igual) está errado, pois incluiria contas com saldo exatamente igual a R$ 1.000, enquanto o enunciado pede saldo superior a R$ 1.000. O DISTINCT resolve o problema de duplicatas, mas a condição de comparação está incorreta.
Alternativa E — ❌ Incorreta
Esta alternativa é quase idêntica à correta (A), mas usa ct.saldo >= 1000 em vez de ct.saldo > 1000. O operador >= inclui contas com saldo igual a R$ 1.000, o que contraria o enunciado que pede saldo superior a R$ 1.000. Portanto, está incorreta.
NÃO CAIA NESSA!
A banca explora a diferença entre > e >=. O enunciado diz "superior a R$ 1.000", que em SQL é > 1000. As alternativas D e E usam >= 1000, incluindo o valor exato de R$ 1.000, o que as torna incorretas. Fique atento a essa sutileza: "superior a" não inclui o valor citado; "maior ou igual" inclui.
PEGA ESSA DICA!
Para questões que pedem "pelo menos um" ou "existe", o EXISTS com subconsulta correlacionada é a ferramenta ideal, pois evita duplicatas e é semanticamente claro. Se a alternativa usar JOIN, verifique se há DISTINCT para evitar repetições. E sempre confira o operador de comparação: > (estritamente maior) vs >= (maior ou igual).