Questão nº 48
Questão de Tecnologia da Informação · FGV DATAPREV 2024 (nº 48)
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_marc 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
- Aalguma questão.
- Bexatamente uma questão.
- Cnenhuma questão. (alternativa correta)
- Dquestões corretas.
- Etodas as questões.
Resposta comentada
Gabarito Alternativa C
NOT EXISTS é um operador SQL que verifica a ausência de linhas em uma subconsulta. Se a subconsulta não retornar nenhuma linha, NOT EXISTS é verdadeiro; caso contrário, é falso. A consulta principal seleciona dados apenas para as linhas onde a condição NOT EXISTS é verdadeira.
- (A) Incorreta: A consulta busca candidatos para os quais não existe nenhuma resposta registrada na tabela
candidato_questao, o que é o oposto de ter respondido "alguma questão". Se fosse para encontrar quem respondeu alguma questão, usaríamosEXISTS(ouINNER JOIN). - (B) Incorreta: A consulta não realiza contagem de respostas; ela apenas verifica a existência (ou não existência) de qualquer registro. Para verificar "exatamente uma questão", seria necessário usar uma subconsulta com
COUNT(*)e comparar o resultado com 1. - (C) Correta: A cláusula
NOT EXISTS (SELECT 1 FROM candidato_questao cq WHERE cq.num_cand = c.num_inscr)é verdadeira para um candidatocse não houver nenhum registro na tabelacandidato_questaoassociado ao seunum_inscr. Isso significa que o candidato não respondeu a nenhuma questão. - (D) Incorreta: A consulta não compara as respostas dos candidatos (
opcao_marc) com o gabarito das questões (gabarito); ela apenas verifica a existência de registros de respostas. Para isso, seria necessário umJOINcom a tabelaquestaoe uma condição de comparação. - (E) Incorreta: Para verificar se um candidato respondeu a "todas as questões", seria necessária uma lógica de "divisão" mais complexa, geralmente envolvendo duas cláusulas
NOT EXISTSaninhadas ou uma comparação de contagens, o que não é o caso nesta consulta.
Fonte: FGV DATAPREV 2024 Analista de Tecnologia da Informação - Arquitetura, Engenharia e Sustentação Tecnológica (Caderno Tipo 1). Reproduzida para fins de estudo.