Pular para o conteúdo principal

Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2024

Banco de DadosSQL
Código
ce191205
Banca
CESPE / CEBRASPE
Órgão
CAGEPA - PB
Ano
2024
Nível
Superior

Imagem da questão

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 por produto cartesiano com condição de igualdade

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; é uma junção interna (INNER JOIN) entre duas ocorrências da tabela Cliente, que retorna apenas os pares de registros que satisfazem a condição de igualdade. Como a representa o cliente antigo (aquele que indica) e b o cliente indicado, o resultado lista os clientes antigos que já fizeram alguma indicação, seguido do nome do cliente indicado e da renda do cliente antigo — exatamente o que a alternativa C descreve.

A consulta usa a sintaxe antiga de junção, onde as tabelas são listadas na cláusula FROM separadas por vírgula e a condição de junção é especificada na cláusula WHERE. Essa sintaxe é equivalente a um INNER JOIN ... ON. A condição a.cpf = b.CPF_cliente_antigo estabelece que, para cada linha da tabela a (cliente antigo), devem ser encontradas linhas na tabela b (clientes indicados) cujo campo CPF_cliente_antigo seja igual ao CPF do cliente antigo. Assim, apenas os clientes antigos que possuem pelo menos um cliente indicado aparecem no resultado, pois a condição de igualdade exige que exista um registro correspondente em b.

O ORDER BY 1 ordena o resultado pela primeira coluna da lista de seleção, que é a.nome (o nome do cliente antigo). A coluna a.renda é a renda do cliente antigo, pois a é o alias da tabela que representa o lado esquerdo da condição (o indicador).

A pegadinha da questão está em identificar corretamente qual alias representa o cliente antigo e qual representa o cliente indicado. Na condição a.cpf = b.CPF_cliente_antigo, o campo CPF_cliente_antigo pertence à tabela b, e ele armazena o CPF do cliente que indicou o cliente b. Portanto, a é o cliente antigo (indicador) e b é o cliente indicado. A alternativa C é a única que reflete corretamente essa relação, incluindo a renda do cliente antigo (a.renda).

Critério

Alternativa C (correta)

Alternativas D e E (incorretas)

Quem aparece na lista

Clientes antigos que já fizeram indicação

Clientes que receberam indicação

Primeira coluna (nome)

a.nome — cliente antigo (indicador)

Descrito como cliente indicado (invertido)

Segunda coluna (nome)

b.nome — cliente indicado

Descrito como cliente antigo (invertido)

Renda exibida

a.renda — renda do cliente antigo

D: renda do indicado (errado); E: renda do antigo (correto)

Motivo da incorreção

D: renda errada; E: ordem dos nomes invertida

Alternativa A — ❌ Incorreta

Afirma que a lista inclui todos os clientes antigos, mesmo os que nunca fizeram indicação. Isso está errado porque a condição a.cpf = b.CPF_cliente_antigo exige que exista um registro em b com o CPF do cliente antigo. Se um cliente antigo nunca indicou ninguém, não haverá nenhum registro em b com CPF_cliente_antigo igual ao CPF dele, e ele não aparecerá no resultado. A junção interna descarta linhas sem correspondência.

Alternativa B — ❌ Incorreta

Afirma que a lista inclui todos os clientes cadastrados, mesmo os que nunca receberam indicação. Isso está errado porque a condição de junção exige que o cliente indicado (b) tenha um CPF_cliente_antigo preenchido e que esse valor corresponda ao CPF de um cliente antigo (a). Clientes que nunca receberam indicação (com CPF_cliente_antigo nulo) não satisfazem a condição e não aparecem. Além disso, a renda exibida é a do cliente antigo (a.renda), não a de cada cliente cadastrado.

Alternativa C — ✅ Correta ⟵ GABARITO

Descreve exatamente o que a consulta retorna: os clientes antigos que já fizeram alguma indicação (pois a condição exige correspondência em b), seguido do nome do cliente indicado (b.nome) e da renda do cliente antigo (a.renda). O ORDER BY 1 ordena pelo nome do cliente antigo.

Alternativa D — ❌ Incorreta

Afirma que a lista inclui 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 seleciona a.renda, que é a renda do cliente antigo (o indicador), não a do cliente indicado. Além disso, a descrição inverte a ordem dos nomes: a primeira coluna é a.nome (cliente antigo), não o nome do cliente indicado.

Alternativa E — ❌ Incorreta

Afirma que a lista inclui 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 ordem dos nomes está invertida: a primeira coluna é a.nome (cliente antigo), não o nome do cliente indicado. A alternativa descreve a lista como se o primeiro nome fosse do cliente indicado, o que não corresponde ao SELECT a.nome, b.nome.

NÃO CAIA NESSA!

A banca explora a confusão entre qual alias é o cliente antigo e qual é o indicado. Na condição a.cpf = b.CPF_cliente_antigo, o campo CPF_cliente_antigo está na tabela b, então b é o cliente indicado e a é o antigo. As alternativas D e E invertem essa relação, e a alternativa A ignora que a junção interna exclui clientes sem indicação. Identifique sempre qual tabela possui a chave estrangeira (o campo que referencia a outra) para saber quem é quem.

PEGA ESSA DICA!

Em consultas com junção implícita (vírgula no FROM), reescreva mentalmente como INNER JOIN ... ON para visualizar o resultado. A condição no WHERE é o critério de junção, e apenas os pares que satisfazem a condição aparecem. Para saber quem é o "antigo" e quem é o "indicado", procure o campo que é chave estrangeira (no caso, CPF_cliente_antigo na tabela b): ele referencia o CPF de outro cliente, que é o antigo.

Gabarito: letra C

Link permanente: /questoes/ce191205