Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2025

Banco de DadosConsultas e Comandos em SQL
Código
qa698956
Banca
Quadrix
Órgão
CRM MS
Ano
2025
Cargo
Ana ( )
O Hospital Campo Grande do Norte deseja gerenciar a participação de seus médicos em congressos médicos. Para isso, um banco de dados relacional foi projetado com as tabelas seguir.   CREATE TABLE Medicos (        id_medico INT PRIMARY KEY,        nome VARCHAR(100) NOT NULL,        especialidade VARCHAR(50) NOT NULL ); CREATE TABLE Congressos (        id_congresso INT PRIMARY KEY,        nome VARCHAR(100) NOT NULL,        local VARCHAR(100) NOT NULL,        data_inicio DATE NOT NULL,        data_fim DATE NOT NULL CHECK (data_fim > = data_inicio) ); CREATE TABLE Participacoes (         id_medico INT,         id_congresso INT,         papel VARCHAR(50) CHECK (papel IN (‘Palestrante’, ‘Ouvinte’, ‘Organizador)),         data_inscricao TIMESTAMP DEFAULT CURRENT_TIMESTAMP,         PRIMARY KEY (id_medico, id_congresso),         FOREIGN KEY (id_medico) REFERENCES Medicos(id_medico) ON DELETE CASCADE,        FOREIGN KEY (id_congresso) REFERENCES Congressos(id_congresso) ON DELETE CASCADE         ); Além disso, para facilitar consultas, foi criada a seguinte view.   Com base nessa situação hipotética, julgue o item a seguir. O comando a seguir encontra todos os médicos que participaram de congressos em 2023, mas não participaram de nenhum congresso em 2024. SELECT DISTINCT M.nome FROM Medicos M JOIN Participacoes P ON M.id_medico = P.id_medico JOIN Congressos C ON P.id_congresso = C.id_congresso WHERE EXTRACT(YEAR FROM C.data_inicio) = 2023 AND M.id_medico NOT IN ( SELECT P2.id_medico FROM Participacoes P2 JOIN Congressos C2 ON P2.id_congresso = C2.id_congresso WHERE EXTRACT(YEAR FROM C2.data_inicio) = 2024 );
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoC — Certo

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: médicos que participaram em 2023 e não em 2024

Gabarito: CERTO (letra C). A consulta está correta: ela seleciona os médicos que têm participação em congresso cuja data_inicio é de 2023 e que não possuem participação em congresso de 2024, usando a subconsulta com NOT IN para excluir exatamente esses. A lógica de conjuntos (participou em 2023 menos participou em 2024) está bem implementada.

Vamos entender o que a consulta faz passo a passo. O objetivo é encontrar médicos que participaram de congressos em 2023, mas não participaram de nenhum congresso em 2024. Isso é uma operação de diferença de conjuntos: queremos o conjunto A (médicos de 2023) menos o conjunto B (médicos de 2024).

A consulta principal faz o seguinte:

  1. SELECT DISTINCT M.nome: seleciona o nome de cada médico, sem repetições (um médico pode ter participado de vários congressos em 2023).

  2. FROM Medicos M JOIN Participacoes P ON M.id_medico = P.id_medico: junta a tabela de médicos com a de participações, para saber quais médicos participaram de algum congresso.

  3. JOIN Congressos C ON P.id_congresso = C.id_congresso: junta com a tabela de congressos, para acessar as datas.

  4. WHERE EXTRACT(YEAR FROM C.data_inicio) = 2023: filtra apenas as participações em congressos que começaram em 2023.

  5. AND M.id_medico NOT IN (SELECT P2.id_medico FROM Participacoes P2 JOIN Congressos C2 ON P2.id_congresso = C2.id_congresso WHERE EXTRACT(YEAR FROM C2.data_inicio) = 2024): a subconsulta retorna todos os médicos que participaram de congressos que começaram em 2024. O NOT IN exclui esses médicos do resultado final.

O resultado: médicos que estão no conjunto de 2023, mas não estão no conjunto de 2024. Exatamente o que o enunciado pede.

Um ponto importante: a consulta usa EXTRACT(YEAR FROM C.data_inicio), ou seja, considera o ano de início do congresso. Se um congresso começou em 2023 e terminou em 2024, ele conta como 2023. Isso é uma escolha de design, mas é consistente com o que o enunciado pede ("participaram de congressos em 2023"). A consulta está correta dentro dessa lógica.

Outro detalhe: o NOT IN com subconsulta é uma forma válida de fazer diferença de conjuntos. Uma alternativa seria usar NOT EXISTS, que às vezes é mais eficiente, mas ambas estão corretas. O NOT IN tem uma pegadinha clássica com valores NULL, mas aqui a coluna id_medico é chave primária e nunca é nula, então não há problema.

Agora, vamos verificar se há alguma pegadinha na consulta que a tornaria incorreta. O DISTINCT é necessário porque um médico pode ter participado de vários congressos em 2023, e sem ele o nome apareceria repetido. O JOIN com Participacoes e Congressos está correto, usando as chaves estrangeiras. A condição EXTRACT(YEAR FROM C.data_inicio) = 2023 filtra corretamente. A subconsulta com NOT IN exclui corretamente os médicos de 2024. Não há erro de sintaxe nem de lógica.

NÃO CAIA NESSA!

A banca poderia tentar confundir o candidato com o uso de NOT IN e valores NULL. Se id_medico pudesse ser NULL na subconsulta, o NOT IN retornaria vazio (porque NULL não é comparável). Mas aqui id_medico é chave primária e nunca é nulo, então a consulta funciona. Outra pegadinha seria inverter os anos (2024 e 2023), mas a consulta está correta.

Item — ✅ CERTO ⟵ GABARITO

A consulta está correta. Ela implementa a diferença de conjuntos: médicos que participaram em 2023 e não em 2024. A lógica está bem construída:

  • A consulta principal seleciona médicos com participação em congressos de 2023.

  • A subconsulta identifica médicos com participação em congressos de 2024.

  • O NOT IN exclui os médicos de 2024 do resultado.

Não há erro de sintaxe, de lógica ou de interpretação. O DISTINCT evita duplicatas, os JOINs estão corretos, e o EXTRACT filtra pelo ano de início do congresso. A consulta atende exatamente ao que o enunciado pede.

Gabarito: letra C (CERTO).

Link permanente: /questoes/qa698956