Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2024
Banco de Dados›SQL
Código
ce191205
Banca
CESPE / CEBRASPE
Órgão
CAGEPA - PB
Ano
2024
Nível
Superior
O comando apresentado no texto CC1A1 emitirá como resultado uma lista com o nome
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.
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.
Cdos clientes antigos que já fizeram alguma indicação, seguido do nome do cliente indicado e da renda do cliente antigo.
Ddos clientes que receberam uma indicação, seguido do nome do cliente antigo que o indicou e da renda do cliente indicado.
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.