Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
ce403648
Banca
CESPE / CEBRASPE
Órgão
CAGEPA
Ano
2024
Cargo
Ana Sist ( )

Uma empresa necessita de um banco de dados para registro de dados de seus clientes, tais como CPF, nome e renda. A fim de identificar unicamente cada um dos clientes, foi escolhido o CPF como chave primária. Nessa empresa, um novo cliente, para ser aceito, precisa ser indicado por um e somente um cliente antigo, que pode ainda não ter indicado ninguém ou já ter indicado vários novos. Os clientes antigos não precisaram ser indicados por outro cliente. No modelo lógico do banco de dados, foi incluído no registro dos clientes, para identificar quem foi o responsável pela indicação, o CPF_cliente_antigo, que pode receber um valor nulo.

 

Nesse contexto, considere o comando SQL/ANSI a seguir.

Select a.nome, b.nome, a.renda

from Cliente a, Cliente b

where a.cpf = b.CPF_cliente_antigo

order by 1;

Leia o Texo CC1A1.   O comando apresentado no texto CC1A1 emitirá como resultado uma lista com o nome
  1. Ade todos os clientes antigos, mesmo dos que nunca fizeram alguma indicação, seguido do nome do cliente indicado e da renda do cliente antigo.
  2. Bde todos os clientes cadastrados, mesmo dos que nunca receberam alguma indicação, seguido do nome do cliente que, eventualmente, o indicou e da renda de cada cliente cadastrado.
  3. Cdos clientes antigos que já fizeram alguma indicação, seguido do nome do cliente indicado e da renda do cliente antigo.
  4. Ddos clientes que receberam uma indicação, seguido do nome do cliente antigo que o indicou e da renda do cliente indicado.
  5. Edos clientes que receberam uma indicação, seguido do nome do cliente antigo que o indicou e da renda do cliente antigo.
Revelar gabarito e comentário

GabaritoC — dos clientes antigos que já fizeram alguma indicação, seguido do nome do cliente indicado e da renda do cliente antigo.

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ção Interna (INNER JOIN) e Auto-Relacionamento

Gabarito: letra C. O comando SELECT a.nome, b.nome, a.renda FROM Cliente a, Cliente b WHERE a.cpf = b.CPF_cliente_antigo ORDER BY 1; realiza uma junção interna (INNER JOIN) entre a tabela Cliente e ela mesma, relacionando cada cliente antigo (a) aos clientes que ele indicou (b). Como a condição a.cpf = b.CPF_cliente_antigo exige que o CPF_cliente_antigo do cliente b seja não nulo e corresponda a um CPF existente, apenas os clientes antigos que já fizeram pelo menos uma indicação aparecem no resultado, seguidos do nome do cliente indicado e da renda do cliente antigo.

A consulta usa a sintaxe de junção implícita (vírgula na cláusula FROM), que é equivalente a um INNER JOIN. Isso significa que apenas os pares de registros que satisfazem a condição de junção são retornados. No contexto do problema, a condição a.cpf = b.CPF_cliente_antigo estabelece que, para cada cliente b que possui um CPF_cliente_antigo (ou seja, que foi indicado por alguém), o registro correspondente do cliente antigo a é recuperado. Portanto, clientes antigos que nunca indicaram ninguém (cujo CPF não aparece como CPF_cliente_antigo em nenhum outro registro) não terão correspondência e serão excluídos do resultado.

Para entender melhor, vamos detalhar o funcionamento da junção. A consulta cria um produto cartesiano entre as duas ocorrências da tabela Cliente (uma como a e outra como b) e, em seguida, aplica o filtro a.cpf = b.CPF_cliente_antigo. Esse filtro seleciona apenas as combinações onde o CPF do cliente a é exatamente o valor armazenado no campo CPF_cliente_antigo do cliente b. Como o campo CPF_cliente_antigo pode ser nulo (clientes que não foram indicados), e a comparação = com NULL nunca é verdadeira, esses registros são naturalmente descartados. Além disso, se um cliente antigo não tiver indicado ninguém, não haverá nenhum registro b com seu CPF como CPF_cliente_antigo, então ele também não aparecerá.

A pegadinha central desta questão está em distinguir o comportamento da junção interna (INNER JOIN) da junção externa (OUTER JOIN). Enquanto a junção interna descarta registros sem correspondência, a junção externa (LEFT, RIGHT ou FULL) preservaria os registros de um dos lados (ou ambos) mesmo sem correspondência. Como a consulta usa uma junção interna, a alternativa correta é a que afirma que apenas os clientes antigos que já fizeram alguma indicação são listados.

NÃO CAIA NESSA!

A banca explora a confusão entre junção interna e externa. Muitos candidatos, ao verem a condição a.cpf = b.CPF_cliente_antigo, podem pensar que todos os clientes antigos aparecerão, mas a junção interna (FROM Cliente a, Cliente b WHERE ...) descarta aqueles que não têm correspondência. A alternativa A, por exemplo, sugere que clientes antigos que nunca indicaram ninguém apareceriam, o que só seria verdade com um LEFT JOIN (que preservaria todos os registros de a). Fique atento: a ausência de LEFT, RIGHT ou FULL na sintaxe indica uma junção interna, que exige correspondência em ambos os lados.

Alternativa A — ❌ Incorreta

Afirma que a lista incluiria "todos os clientes antigos, mesmo dos que nunca fizeram alguma indicação". Isso só ocorreria com uma junção externa à esquerda (LEFT JOIN), que preservaria todos os registros da tabela a (clientes antigos) mesmo sem correspondência em b. Como a consulta usa uma junção interna (FROM Cliente a, Cliente b WHERE a.cpf = b.CPF_cliente_antigo), os clientes antigos que nunca indicaram ninguém não têm nenhum registro b com seu CPF como CPF_cliente_antigo, portanto são excluídos do resultado.

Alternativa B — ❌ Incorreta

Afirma que a lista incluiria "todos os clientes cadastrados, mesmo dos que nunca receberam alguma indicação". Isso só ocorreria com uma junção externa à direita (RIGHT JOIN), que preservaria todos os registros da tabela b (clientes indicados) mesmo sem correspondência em a. Na consulta, a condição a.cpf = b.CPF_cliente_antigo exige que o CPF_cliente_antigo de b seja não nulo e corresponda a um CPF existente em a. Clientes que nunca receberam indicação têm CPF_cliente_antigo nulo, e a comparação com NULL nunca é verdadeira, então eles são descartados.

Alternativa C — ✅ Correta ⟵ GABARITO

A consulta retorna apenas os clientes antigos que já fizeram alguma indicação, pois a junção interna (a.cpf = b.CPF_cliente_antigo) exige que exista pelo menos um cliente b cujo CPF_cliente_antigo seja igual ao CPF do cliente a. Para cada um desses clientes antigos, a consulta retorna o nome do cliente antigo (a.nome), o nome do cliente indicado (b.nome) e a renda do cliente antigo (a.renda). A cláusula ORDER BY 1 ordena o resultado pelo nome do cliente antigo (primeira coluna).

Alternativa D — ❌ Incorreta

Afirma que a lista incluiria "os clientes que receberam uma indicação, seguido do nome do cliente antigo que o indicou e da renda do cliente indicado". O erro está na renda: a consulta retorna a.renda, que é a renda do cliente antigo (o indicador), não a renda do cliente indicado (b.renda). Além disso, a descrição "clientes que receberam uma indicação" é imprecisa, pois o foco da consulta é listar os clientes antigos (indicadores) e seus indicados, não os clientes que receberam indicação como entidade principal.

Alternativa E — ❌ Incorreta

Afirma que a lista incluiria "os clientes que receberam uma indicação, seguido do nome do cliente antigo que o indicou e da renda do cliente antigo". Embora a renda esteja correta (a.renda), a descrição "clientes que receberam uma indicação" como entidade principal está invertida. A consulta lista os clientes antigos (indicadores) e, para cada um, o cliente que ele indicou. O foco é o cliente antigo, não o cliente indicado. A alternativa C descreve corretamente essa relação.

Gabarito: letra C

Link permanente: /questoes/ce403648