Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2025

Banco de DadosConsultas 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.Imagem associada para resolução da questão
  1. ASELECT nome     FROM clientes c     WHERE EXISTS (          SELECT 1 FROM contas ct          WHERE ct.id_cliente = c.id_cliente AND ct.saldo > 1000)
  2. BSELECT nome      FROM clientes c      WHERE NOT EXISTS (            SELECT * FROM contas ct            WHERE ct.id_cliente = c.id_cliente AND ct.saldo < 1000)
  3. CSELECT nome      FROM clientes c      JOIN contas ct ON c.id_cliente = ct.id_cliente      WHERE ct.saldo > 1000
  4. DSELECT DISTINCT nome     FROM clientes c     JOIN contas ct ON c.id_cliente = ct.id_cliente     WHERE ct.saldo >= 1000
  5. 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).

Gabarito: letra A

Link permanente: /questoes/ce417322