Um banco de dados relacional foi criado para registrar os cursos realizados por psicólogos em uma clínica
de treinamento. O banco de dados não possui colunas com autoincremento e contém as seguintes tabelas: PSICOLOGO (id_psicologo (PK, INT), nome (VARCHAR), email (VARCHAR)); CURSO (id_curso (PK, INT),
nome_curso (VARCHAR), duracao (INT)); INSCRICAO (id_inscricao (PK, INT), id_psicologo (FK, INT),
id_curso
(FK, INT), data_inscricao (DATE)); CERTIFICADO (id_certificado (PK, INT),
id_inscricao (FK, INT), data_certificado (DATE)).
Com base nessa situação hipotética e na linguagem SQL, julgue o item seguinte.
A instrução SQL a seguir retorna somente os psicólogos que possuem certificado de conclusão de curso.SELECT nomeFROM psicologo pWHERE EXISTS (SELECT *FROM certificado cWHERE c.id inscricao = p.id_psicologo);
CCerto
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”.
SQL: subconsultas correlacionadas e a semântica do EXISTS
Gabarito: ERRADO (letra E). A instrução SQL apresentada não retorna somente os psicólogos que possuem certificado de conclusão de curso, pois a subconsulta correlacionada compara a coluna id_inscricao da tabela CERTIFICADO com a coluna id_psicologo da tabela PSICOLOGO, que são chaves de tabelas diferentes e não possuem relação direta. Para que a consulta funcionasse corretamente, seria necessário relacionar as tabelas por meio da tabela INSCRICAO, que faz a ponte entre PSICOLOGO e CERTIFICADO.
A instrução SELECT é um comando da sublinguagem DML (Data Manipulation Language) e é utilizada para recuperar dados de uma ou mais tabelas. A cláusula WHERE EXISTS é usada para filtrar registros com base na existência de registros correspondentes em uma subconsulta. No caso de uma subconsulta correlacionada, a subconsulta é executada para cada linha da consulta externa, e a condição de correlação deve comparar colunas que estejam relacionadas entre as tabelas envolvidas.
No esquema apresentado, temos as tabelas PSICOLOGO, CURSO, INSCRICAO e CERTIFICADO. A tabela INSCRICAO possui as chaves estrangeiras id_psicologo e id_curso, e a tabela CERTIFICADO possui a chave estrangeira id_inscricao. Portanto, para saber se um psicólogo possui certificado, é necessário verificar se existe um registro em CERTIFICADO cujo id_inscricao corresponda a uma inscrição daquele psicólogo. A consulta correta deveria fazer a junção entre PSICOLOGO, INSCRICAO e CERTIFICADO, ou usar uma subconsulta correlacionada que compare c.id_inscricao com i.id_inscricao (após relacionar INSCRICAO com PSICOLOGO).
A consulta apresentada compara c.id_inscricao com p.id_psicologo. Isso está semanticamente incorreto, pois id_inscricao é uma chave primária da tabela INSCRICAO e id_psicologo é uma chave primária da tabela PSICOLOGO. Não há relação direta entre essas colunas. Dependendo dos dados, essa comparação pode retornar resultados incorretos ou até mesmo não retornar nenhum registro, mesmo que existam psicólogos com certificados. Por exemplo, se um psicólogo com id_psicologo = 1 tiver uma inscrição com id_inscricao = 10 e um certificado com id_inscricao = 10, a condição c.id_inscricao = p.id_psicologo seria 10 = 1, que é falsa, e o psicólogo não seria retornado, mesmo tendo certificado.
A pegadinha da banca está em trocar a coluna de junção na subconsulta: em vez de comparar c.id_inscricao com i.id_inscricao (após relacionar INSCRICAO com PSICOLOGO), a consulta compara c.id_inscricao com p.id_psicologo. Isso faz com que a consulta não retorne corretamente os psicólogos com certificado, pois a condição de correlação está errada.
Para resolver corretamente, seria necessário usar um JOIN entre PSICOLOGO, INSCRICAO e CERTIFICADO, ou uma subconsulta correlacionada que faça a ponte pela tabela INSCRICAO. Por exemplo:
SELECT nome
FROM psicologo p
WHERE EXISTS (
SELECT 1
FROM inscricao i
JOIN certificado c ON c.id_inscricao = i.id_inscricao
WHERE i.id_psicologo = p.id_psicologo
);
Ou, alternativamente, usando INNER JOIN:
SELECT DISTINCT p.nome
FROM psicologo p
JOIN inscricao i ON i.id_psicologo = p.id_psicologo
JOIN certificado c ON c.id_inscricao = i.id_inscricao;
A instrução apresentada no enunciado está, portanto, incorreta, pois não retorna somente os psicólogos com certificado, mas sim um resultado imprevisível baseado em uma comparação incorreta de chaves.
Critério
Consulta do enunciado (ERRADA)
Consulta correta (via INSCRICAO)
Coluna comparada na subconsulta
c.id_inscricao = p.id_psicologo (chaves de tabelas diferentes, sem relação direta)
Apenas PSICOLOGO e CERTIFICADO (sem a ponte INSCRICAO)
PSICOLOGO, INSCRICAO e CERTIFICADO (junção correta)
Semântica da condição
Compara PK de INSCRICAO com PK de PSICOLOGO — não verifica vínculo real
Verifica se existe certificado ligado à inscrição do psicólogo
Resultado possível
Conjunto vazio ou resultados incorretos/imprevisíveis
Retorna exatamente os psicólogos com certificado
Exemplo prático
id_psicologo=1, id_inscricao=10 → 10=1 (falso, não retorna)
id_inscricao=10 ligado ao psicólogo 1 → retorna corretamente
Item — ❌ ERRADO
A afirmação de que a instrução SQL retorna somente os psicólogos que possuem certificado de conclusão de curso está errada. O erro está na condição de correlação da subconsulta: c.id_inscricao = p.id_psicologo. Essa comparação não faz sentido, pois id_inscricao é a chave primária da tabela INSCRICAO e id_psicologo é a chave primária da tabela PSICOLOGO. Não há relação direta entre essas colunas. Para que a consulta funcionasse, seria necessário relacionar as tabelas por meio da tabela INSCRICAO, que contém as chaves estrangeiras id_psicologo e id_curso, e a tabela CERTIFICADO, que contém a chave estrangeira id_inscricao. A consulta correta deveria comparar c.id_inscricao com i.id_inscricao, onde i.id_psicologo = p.id_psicologo. Portanto, a instrução não retorna somente os psicólogos com certificado, podendo retornar um conjunto vazio ou resultados incorretos.