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
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.
  1. 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
  2. BSELECT ct.id_conta      FROM contas ct      LEFT JOIN clientes c ON c.id_cliente = ct.id_cliente
  3. 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
  4. 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
  5. 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.

  1. 1Base: tabela contas
  2. 2LEFT JOIN com clientes
  3. 3SELECT id_conta, nome
  4. 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.

Gabarito: letra C

Link permanente: /questoes/ce417321