Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas e Comandos em SQL
Código
fg165292
Banca
FGV
Órgão
DATAPREV
Ano
2024
Cargo
Ana TI ( )

ATENÇÃO:

 

O texto a seguir deve ser usado para a próxima questão.

 

O esquema de um banco de dados relacional, especificado pelos comandos SQL a seguir, atenderá às consultas

 

create table candidato
(
    num_inscr    int         primary key,
    cpf_cand     char(11)    unique,
    nome         varchar(30)
);

create table questao
(
    id           int         primary key,
    texto        varchar(20) not null,
    gabarito     char(1)     check (gabarito in ('A','B','C','D','E'))
);

create table candidato_questao
(
    num_cand     int,
    cpf_cand     char(11),
    id_quest     int,
    opcao_mar    char(1),
    primary key(num_cand,id_quest),
    unique(cpf_cand,id_quest),
    foreign key(num_cand) references candidato,
    foreign key(cpf_cand) references candidato(cpf_cand),
    foreign key(id_quest) references questao
);

 

Considere que todos os candidatos que responderam questões tenham suas respostas registradas na tabela

   

candidato_questao.
select c.num_inscr, c.nome from candidato c
where not exists
    ( select 1 from candidato_questao cq
      where cq.num_cand = c.num_inscr );

 

A execução da consulta SQL especificada produz como resultado o número de inscrição e nome dos candidatos que responderam a

  1. Aalguma questão.
  2. Bexatamente uma questão.
  3. Cnenhuma questão.
  4. Dquestões corretas.
  5. Etodas as questões.
Revelar gabarito e comentário

GabaritoC — nenhuma questão.

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”.

Consulta SQL com NOT EXISTS: candidatos sem respostas

Gabarito: letra C. A consulta retorna o número de inscrição e o nome dos candidatos que não possuem nenhum registro na tabela candidato_questao, ou seja, que não responderam a nenhuma questão. O operador NOT EXISTS nega a existência de qualquer linha correspondente na subconsulta, e a subconsulta correlacionada busca registros de candidato_questao cujo num_cand seja igual ao num_inscr do candidato da consulta externa.

A consulta SQL apresentada utiliza uma subconsulta correlacionada com o operador NOT EXISTS. Para entender o resultado, é essencial decompor a lógica:

  1. Consulta externa: seleciona num_inscr e nome de cada candidato da tabela candidato (aliás c).

  2. Subconsulta correlacionada: para cada candidato, executa SELECT 1 FROM candidato_questao cq WHERE cq.num_cand = c.num_inscr. Essa subconsulta retorna uma linha se existir pelo menos um registro em candidato_questao com num_cand igual ao num_inscr do candidato atual.

  3. Operador NOT EXISTS: a condição WHERE NOT EXISTS (subconsulta) é verdadeira quando a subconsulta não retorna nenhuma linha. Ou seja, o candidato é incluído no resultado apenas se não existir nenhum registro de resposta para ele.

Portanto, a consulta devolve os candidatos que não responderam a nenhuma questão — exatamente o que a alternativa C afirma.

Para fixar, veja um exemplo prático. Suponha que a tabela candidato tenha:

num_inscr

nome

1

Ana

2

Bruno

3

Carla

E a tabela candidato_questao tenha:

num_cand

id_quest

opcao_mar

1

10

A

1

11

B

3

10

C

A consulta retornará apenas o candidato 2 (Bruno), pois não há nenhum registro em candidato_questao com num_cand = 2. Ana (1) e Carla (3) têm respostas registradas, então NOT EXISTS é falso para elas.

A pegadinha da questão está em confundir NOT EXISTS com EXISTS. Enquanto EXISTS retorna verdadeiro se a subconsulta tiver pelo menos uma linha, NOT EXISTS retorna verdadeiro se a subconsulta não tiver nenhuma linha. A banca explora exatamente essa inversão lógica.

NÃO CAIA NESSA!

A banca troca o sentido do operador: NOT EXISTS é o oposto de EXISTS. Muitos candidatos leem a consulta como se ela buscasse quem respondeu alguma questão (alternativa A), mas o NOT nega a existência. Lembre-se: NOT EXISTS = não existe registro correspondente.

Alternativa A — ❌ Incorreta

Afirma que a consulta retorna candidatos que responderam alguma questão. Isso seria o resultado de EXISTS (sem o NOT), não de NOT EXISTS. A consulta usa NOT EXISTS, que nega a existência de respostas, portanto retorna quem não respondeu nenhuma.

Alternativa B — ❌ Incorreta

Afirma que retorna candidatos que responderam exatamente uma questão. A consulta não faz nenhuma contagem de respostas; ela apenas verifica a existência de pelo menos um registro. Não há condição que limite a quantidade de respostas a uma.

Alternativa C — ✅ Correta ⟵ GABARITO

A consulta retorna candidatos que não responderam a nenhuma questão. O NOT EXISTS com a subconsulta correlacionada seleciona apenas os candidatos sem nenhum registro em candidato_questao, como demonstrado no exemplo.

Alternativa D — ❌ Incorreta

Afirma que retorna candidatos que responderam questões corretas. A consulta não verifica se a opção marcada (opcao_mar) coincide com o gabarito da questão (gabarito). Não há junção com a tabela questao nem comparação de valores. A consulta apenas verifica a existência de qualquer resposta, independentemente de estar correta.

Alternativa E — ❌ Incorreta

Afirma que retorna candidatos que responderam todas as questões. A consulta não compara a quantidade de respostas com o total de questões existentes. Não há COUNT, GROUP BY ou HAVING para verificar se o candidato respondeu todas. A lógica de NOT EXISTS apenas identifica quem não tem nenhuma resposta.

Gabarito: letra C — a consulta retorna os candidatos que não responderam a nenhuma questão.

Link permanente: /questoes/fg165292