Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2025
- Código
- qa698951
- Banca
- Quadrix
- Órgão
- CRM MS
- Ano
- 2025
- Cargo
- Ana ( )
- CCerto
- EErrado
GabaritoC — Certo
Gabarito: CERTO (letra C). O comando apresentado é válido e cumpre exatamente o que o enunciado pede: ele exclui o médico de id_medico = 5 apenas se não existir nenhum registro na tabela Atendimentos com esse mesmo id_medico, garantindo a integridade referencial antes da exclusão. A lógica está correta e a sintaxe é aceita pelos principais SGBDs relacionais.
O comando DELETE é um comando da sublinguagem DML (Data Manipulation Language), responsável por manipular os dados dentro das tabelas. Diferentemente do DROP, que remove a estrutura da tabela, o DELETE remove linhas (registros) de uma tabela existente. A sintaxe básica é DELETE FROM nome_tabela WHERE condição. Sem a cláusula WHERE, o comando apagaria todas as linhas da tabela, o que raramente é desejado.
A questão explora um cenário clássico de integridade referencial: a tabela Atendimentos possui uma chave estrangeira (FOREIGN KEY) que referencia a tabela Medicos. Isso significa que não se pode simplesmente excluir um médico que possua atendimentos vinculados, pois isso violaria a integridade referencial — o banco de dados rejeitaria a operação (a menos que a chave estrangeira tenha sido definida com ON DELETE CASCADE, o que não é o caso aqui).
A solução apresentada usa uma subconsulta correlacionada com NOT EXISTS. A subconsulta SELECT 1 FROM Atendimentos WHERE id_medico = 5 verifica se existe pelo menos um atendimento com id_medico = 5. O NOT EXISTS retorna verdadeiro apenas se a subconsulta não retornar nenhuma linha. Assim, o DELETE só é executado se não houver atendimentos vinculados ao médico 5. Essa é uma técnica correta e amplamente utilizada para garantir que a exclusão não viole a integridade referencial.
É importante notar que a subconsulta poderia ser escrita de forma mais elegante usando uma correlação com a linha que está sendo avaliada, por exemplo: NOT EXISTS (SELECT 1 FROM Atendimentos a WHERE a.id_medico = Medicos.id_medico). No entanto, como o comando filtra por um valor fixo (id_medico = 5), a forma apresentada também é correta e funciona perfeitamente. A banca não exige a forma mais otimizada, apenas que o comando atinja o objetivo proposto.
A banca pode tentar confundir o candidato sugerindo que o comando está errado porque a subconsulta não está correlacionada com a linha que está sendo excluída. Mas, como o WHERE já fixa o id_medico = 5, a subconsulta também filtra por esse mesmo valor, tornando a correlação desnecessária. O comando está correto.
O comando DELETE FROM Medicos WHERE id_medico = 5 AND NOT EXISTS (SELECT 1 FROM Atendimentos WHERE id_medico = 5) está correto. Ele:
Filtra a linha da tabela Medicos com id_medico = 5;
Verifica, por meio da subconsulta com NOT EXISTS, se existe algum registro em Atendimentos com id_medico = 5;
Se não existir, executa a exclusão; se existir, não executa, preservando a integridade referencial.
A sintaxe é válida em SGBDs como MySQL, PostgreSQL, SQL Server e Oracle. A lógica atende exatamente ao requisito do enunciado: "garantindo que não existam atendimentos vinculados a ele".
Gabarito: letra C (CERTO)
Link permanente: /questoes/qa698951