Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2025
- Código
- qa698952
- Banca
- Quadrix
- Órgão
- CRM MS
- Ano
- 2025
- Cargo
- Ana ( )
- CCerto
- EErrado
GabaritoE — Errado
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 |
|
|
|
|---|---|---|---|
Comportamento com | Retorna conjunto vazio se houver qualquer | Ignora | Ignora |
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 |
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