Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2025
Banco de Dados›Consultas e Comandos em SQL
Código
ce417321
Banca
CESPE / CEBRASPE
Órgão
BANRISUL
Ano
2025
Cargo
Tec TI ( )
Em um sistema bancário, existem duas tabelas: clientes (id_cliente, nome); e contas (id_conta, id_cliente,saldo). Pretende-se obter uma lista que contenha o id_conta eo nome dos clientes que possuem conta associada, incluídos somente os registros em que haja saldo informado na conta (ou seja, saldo não nulo). Com base nessa situação hipotética, assinale a opção que corresponde à consulta correta para exibir os dados solicitados.
ASELECT c.nome, ct.id_conta FROM clientes c LEFT JOIN contas ct ON ct.id_cliente = c.id_cliente WHERE ct.saldo IS NOT NULL
BSELECT ct.id_conta FROM contas ct LEFT JOIN clientes c ON c.id_cliente = ct.id_cliente
CSELECT ct.id_conta, c.nome FROM contas ct LEFT JOIN clientes c ON ct.id_cliente = c.id_cliente WHERE ct.saldo IS NOT NULL
DSELECT c.nome, ct.id_conta FROM contas ct LEFT JOIN clientes c ON ct.id_cliente = c.id_cliente WHERE ct.saldo IS NOT NULL
ESELECT c.nome, ct.id_conta FROM contas ct LEFT JOIN clientes c ON ct.id_cliente = c.id_cliente WHERE ct.saldo IS NULL
Revelar gabarito e comentário▾
GabaritoC — SELECT ct.id_conta, c.nome
FROM contas ct
LEFT JOIN clientes c ON ct.id_cliente =
c.id_cliente
WHERE ct.saldo IS NOT NULL
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 – Junções e Filtro de Valores Nulos
Gabarito: letra C. A consulta correta deve partir da tabela contas (pois só interessam clientes com conta associada), fazer o LEFT JOIN com clientes e filtrar com WHERE ct.saldo IS NOT NULL — exatamente o que a alternativa C faz. A alternativa D comete o mesmo raciocínio, mas inverte a ordem das colunas no SELECT, o que não atende ao pedido de exibir id_conta e nome.
O cerne da questão está em dois pontos: (1) qual tabela deve ser a base do JOIN e (2) como filtrar valores nulos. Vamos destrinchar cada um.
1. A tabela-base do JOIN. O enunciado pede "clientes que possuem conta associada". Isso significa que a consulta deve começar pela tabela contas — cada registro de contas representa uma conta existente, e o JOIN com clientes apenas busca o nome correspondente. Se começássemos por clientes, estaríamos partindo de todos os clientes, inclusive os que não têm conta, o que exigiria um filtro adicional para excluí-los. A alternativa A faz exatamente isso: parte de clientes e usa LEFT JOIN com contas, mas o WHERE ct.saldo IS NOT NULL acaba eliminando os clientes sem conta (cujo saldo seria nulo), então ela até funcionaria — mas a alternativa C é mais direta e semanticamente mais limpa, partindo da tabela que contém os dados essenciais.
2. O filtro de nulos. A comparação com NULL não pode ser feita com operadores comuns como = ou <>. Qualquer comparação com NULL resulta em UNKNOWN, que é tratado como falso no WHERE. Por isso, para verificar se um valor é nulo, usa-se IS NULL; para verificar se não é nulo, usa-se IS NOT NULL. A alternativa E usa WHERE ct.saldo IS NULL, que retornaria justamente as contas com saldo nulo — o oposto do pedido.
3. A ordem das colunas no SELECT. O enunciado pede "id_conta e o nome dos clientes". A alternativa C seleciona ct.id_conta, c.nome, na ordem exata. A alternativa D seleciona c.nome, ct.id_conta, invertendo a ordem. Embora a ordem das colunas no SELECT não altere o resultado lógico da consulta, a banca considerou que a alternativa C é a que corresponde literalmente ao pedido.
4. Por que não usar INNER JOIN? Um INNER JOIN entre contas e clientes também retornaria apenas clientes com conta associada, e seria igualmente correto. No entanto, nenhuma alternativa usa INNER JOIN — todas usam LEFT JOIN. A alternativa C usa LEFT JOIN corretamente, pois parte de contas (tabela à esquerda) e junta com clientes; como toda conta tem um cliente associado (presumindo integridade referencial), o LEFT JOIN se comporta como um INNER JOIN na prática.
A pegadinha clássica aqui é dupla: (a) inverter a tabela-base do JOIN, fazendo o candidato partir de clientes quando deveria partir de contas; e (b) usar IS NULL em vez de IS NOT NULL, invertendo o filtro. A alternativa E cai na segunda armadilha; a alternativa A cai na primeira (embora funcione por acaso); a alternativa D acerta o raciocínio mas erra a ordem das colunas.
NÃO CAIA NESSA!
A banca explora duas inversões: (1) a tabela-base do JOIN — o candidato parte de clientes quando deveria partir de contas, pois só interessam clientes com conta; (2) o filtro de nulos — IS NULL retorna o oposto do pedido. A alternativa E é a armadilha mais óbvia: usa IS NULL, que devolve justamente as contas sem saldo informado. Fique atento: WHERE ct.saldo IS NOT NULL é o filtro correto.
1Base: tabela contas
2LEFT JOIN com clientes
3SELECT id_conta, nome
4WHERE saldo IS NOT NULL
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Parte da tabela clientes com LEFT JOIN em contas. Embora o WHERE ct.saldo IS NOT NULL acabe eliminando clientes sem conta (cujo saldo seria nulo), a consulta parte da tabela errada. O enunciado pede clientes com conta associada, então a base deve ser contas. Além disso, a ordem das colunas (c.nome, ct.id_conta) inverte o pedido.
Alternativa B — ❌ Incorreta
Seleciona apenas ct.id_conta, omitindo o nome do cliente. O enunciado pede explicitamente "id_conta e o nome dos clientes". Além disso, não há filtro WHERE para excluir saldos nulos.
Alternativa C — ✅ Correta ⟵ GABARITO
Parte da tabela contas (correto, pois só interessam contas existentes), faz LEFT JOIN com clientes na condição ct.id_cliente = c.id_cliente (correto), seleciona ct.id_conta, c.nome na ordem pedida, e filtra com WHERE ct.saldo IS NOT NULL (correto, pois exclui contas sem saldo informado). É a única alternativa que atende integralmente ao enunciado.
Alternativa D — ❌ Incorreta
Mesmo raciocínio da alternativa C, mas inverte a ordem das colunas no SELECT: c.nome, ct.id_conta. O enunciado pede "id_conta e o nome", então a ordem correta é ct.id_conta, c.nome. Embora a ordem não altere o resultado lógico, a banca considerou que a alternativa C é a que corresponde literalmente ao pedido.
Alternativa E — ❌ Incorreta
Usa WHERE ct.saldo IS NULL, que retorna justamente as contas com saldo nulo — o oposto do pedido. O enunciado quer contas com saldo informado (não nulo), então o filtro correto é IS NOT NULL.