Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2024
- Código
- qa630754
- Banca
- Quadrix
- Órgão
- CFP
- Ano
- 2024
- Cargo
- Ana Tec ( )
- CCerto
- EErrado
GabaritoE — Errado
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 — ou seja, compara chaves de tabelas diferentes, o que faz a condição nunca ser verdadeira (a menos que, por coincidência, os valores coincidam). O correto seria comparar c.id_inscricao com i.id_inscricao, após relacionar INSCRICAO com PSICOLOGO e CERTIFICADO.
A questão exige o domínio de subconsultas correlacionadas e da semântica do operador EXISTS. Uma subconsulta correlacionada é aquela que faz referência a colunas da consulta externa, sendo avaliada para cada linha da consulta principal. O EXISTS retorna verdadeiro se a subconsulta retornar pelo menos uma linha. No caso, a subconsulta é avaliada para cada psicólogo p, e a condição c.id_inscricao = p.id_psicologo compara a chave estrangeira da tabela CERTIFICADO com a chave primária da tabela PSICOLOGO. Como id_inscricao e id_psicologo são conceitos distintos — o primeiro identifica uma inscrição, o segundo identifica um psicólogo —, essa comparação não faz sentido lógico e, na prática, raramente (ou nunca) será verdadeira, fazendo a consulta retornar um conjunto vazio ou um resultado incorreto.
Para que a consulta retorne corretamente os psicólogos com certificado, seria necessário relacionar as tabelas PSICOLOGO, INSCRICAO e CERTIFICADO. Uma forma correta seria:
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
);Aqui, a subconsulta correlacionada compara i.id_psicologo (da tabela INSCRICAO) com p.id_psicologo (da tabela PSICOLOGO), e faz o JOIN entre INSCRICAO e CERTIFICADO pela chave id_inscricao. Assim, o EXISTS verifica se existe pelo menos uma inscrição daquele psicólogo que possua certificado.
A pegadinha da banca está em trocar a coluna de junção: em vez de usar id_inscricao (que é a chave que liga INSCRICAO a CERTIFICADO), a consulta usa id_psicologo, que é a chave de outra tabela. Isso faz a condição ser logicamente incorreta, pois compara atributos de entidades diferentes. O candidato que não percebe essa troca pode achar que a consulta está correta, mas ela não atende ao que o enunciado pede.
A banca troca a coluna de junção na subconsulta: em vez de comparar c.id_inscricao com i.id_inscricao (após relacionar as tabelas), ela compara c.id_inscricao com p.id_psicologo. Isso faz a condição nunca ser verdadeira, pois são chaves de entidades diferentes. Fique atento: em subconsultas correlacionadas, a coluna comparada deve ser a chave que relaciona as tabelas envolvidas.
Aspecto | Consulta original (errada) | Consulta correta |
|---|---|---|
Coluna comparada na subconsulta |
|
|
Tabelas envolvidas | Apenas |
|
Resultado prático | Retorna conjunto vazio ou resultado incorreto (condição nunca verdadeira) | Retorna corretamente apenas psicólogos com certificado |
Semântica do EXISTS | Verifica existência de certificado com | Verifica existência de certificado para inscrições do psicólogo (correto) |
A instrução SQL está incorreta porque a subconsulta correlacionada compara c.id_inscricao (chave estrangeira da tabela CERTIFICADO) com p.id_psicologo (chave primária da tabela PSICOLOGO). Essas colunas pertencem a tabelas diferentes e não possuem relação direta: id_inscricao identifica uma inscrição, enquanto id_psicologo identifica um psicólogo. Para que a consulta retorne os psicólogos com certificado, seria necessário relacionar PSICOLOGO com INSCRICAO (via id_psicologo) e INSCRICAO com CERTIFICADO (via id_inscricao), e então verificar a existência do certificado. A consulta apresentada não faz esse relacionamento corretamente, portanto não retorna o resultado esperado.
Gabarito: letra E (ERRADO).
Link permanente: /questoes/qa630754