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
qa698952
Banca
Quadrix
Órgão
CRM MS
Ano
2025
Cargo
Ana ( )
O Hospital Campo Grande está implementando um novo sistema de banco de dados para gerenciar informações sobre médicos, pacientes e atendimentos. O banco de dados apresenta as tabelas a seguir.   CREATE TABLE Medicos (        id_medico INT PRIMARY KEY,        nome VARCHAR(100),        especialidade VARCHAR(50),        salario DECIMAL(10,2) ); CREATE TABLE Pacientes (        id_paciente INT PRIMARY KEY,        nome VARCHAR(100),        data_nascimento DATE ); CREATE TABLE Atendimentos (        id_atendimento INT PRIMARY KEY,        id_medico INT,        id_paciente INT,       data_atendimento DATE,       descricao VARCHAR(100),       FOREIGN KEY (id_medico) REFERENCES Medicos(id_medico),       FOREIGN KEY (id_paciente) REFERENCES Pacientes(id_paciente) );   Com relação à situação hipotética apresentada e aos comandos SQL, julgue o item seguinte.   O comando a seguir retorna os pacientes que nunca foram atendidos: SELECT P.nome FROM Pacientes P WHERE P.id_paciente NOT IN (SELECT DISTINCT id_paciente FROM Atendimentos);
  1. CCerto
  2. EErrado
Revelar gabarito e comentário

GabaritoE — Errado

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

Consultas SQL: NOT IN e subconsultas

Gabarito: ERRADO (letra E). O comando apresentado não retorna corretamente os pacientes que nunca foram atendidos, pois o uso de NOT IN com uma subconsulta que pode retornar valores NULL faz com que o resultado seja sempre vazio. Para obter o resultado desejado, seria necessário usar NOT EXISTS ou garantir que a subconsulta não retorne NULL.

O comando SELECT P.nome FROM Pacientes P WHERE P.id_paciente NOT IN (SELECT DISTINCT id_paciente FROM Atendimentos) tem a intenção de encontrar pacientes cujo id_paciente não aparece na tabela Atendimentos. A lógica parece correta à primeira vista: se um paciente não está na lista de atendimentos, ele nunca foi atendido. No entanto, há uma armadilha clássica do SQL: quando a subconsulta retorna pelo menos um valor NULL, o operador NOT IN não retorna nenhuma linha, mesmo que existam pacientes que atendam à condição.

Para entender por que isso acontece, é preciso lembrar como o SQL lida com valores NULL. O NULL representa um valor desconhecido. Quando você usa NOT IN, o SQL compara o valor da coluna com cada valor da lista. Se qualquer comparação resultar em NULL (porque um dos valores da lista é NULL), o resultado da expressão NOT IN também será NULL, e a linha não será incluída no resultado. Isso significa que, se a tabela Atendimentos tiver pelo menos um registro com id_paciente nulo, a consulta retornará um conjunto vazio, mesmo que existam pacientes sem atendimento.

Na tabela Atendimentos criada no enunciado, a coluna id_paciente é definida como INT e possui uma FOREIGN KEY referenciando Pacientes(id_paciente). Embora a definição não especifique explicitamente NOT NULL, a coluna pode aceitar valores nulos, a menos que haja uma restrição implícita. Em muitos SGBDs, uma coluna que é chave estrangeira pode aceitar NULL por padrão, a menos que seja definida como NOT NULL. Portanto, é possível que a subconsulta retorne NULL, o que invalida o uso de NOT IN.

A alternativa correta para essa consulta seria usar NOT EXISTS, que verifica a existência de registros sem o problema do NULL. Por exemplo:

SELECT P.nome
FROM Pacientes P
WHERE NOT EXISTS (SELECT 1 FROM Atendimentos A WHERE A.id_paciente = P.id_paciente);

Essa consulta retorna os pacientes para os quais não existe nenhum registro na tabela Atendimentos, independentemente de valores nulos.

Outra forma seria usar um LEFT JOIN e verificar se o id_paciente da tabela Atendimentos é nulo:

SELECT P.nome
FROM Pacientes P
LEFT JOIN Atendimentos A ON P.id_paciente = A.id_paciente
WHERE A.id_paciente IS NULL;

Essa abordagem também é segura e retorna os pacientes sem atendimento.

A pegadinha da questão está exatamente no comportamento do NOT IN com NULL. Muitos candidatos conhecem a lógica básica do NOT IN, mas não consideram o impacto dos valores nulos. A banca explora essa lacuna de conhecimento para induzir ao erro.

Critério

NOT IN (comando original)

NOT EXISTS (correção)

LEFT JOIN ... IS NULL (correção)

Comportamento com NULL na subconsulta

Retorna conjunto vazio se houver qualquer NULL

Ignora NULL e avalia linha a linha

Ignora NULL e avalia linha a linha

Resultado esperado (pacientes sem atendimento)

❌ Incorreto (vazio)

✅ Correto

✅ Correto

Legibilidade/uso comum

Simples, porém arriscado

Mais verboso, porém seguro

Muito usado em relatórios

Desempenho típico

Pode ser ineficiente com grandes volumes

Geralmente eficiente com índice na FK

Eficiente com índice na FK

Alternativa E — ❌ Incorreta ⟵ GABARITO

A afirmação de que o comando retorna os pacientes que nunca foram atendidos está incorreta. O comando usa NOT IN com uma subconsulta que pode retornar valores NULL, o que faz com que a consulta retorne um conjunto vazio. Para obter o resultado desejado, seria necessário usar NOT EXISTS ou LEFT JOIN com verificação de NULL.

Gabarito: letra E

Link permanente: /questoes/qa698952