Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2024

Banco de DadosConsultas e Comandos em SQL
Código
qa630754
Banca
Quadrix
Órgão
CFP
Ano
2024
Cargo
Ana Tec ( )
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 os itens seguintes.   A instrução SQL a seguir retorna somente os psicólogos que possuem certificado de conclusão de curso. SELECT nome FROM psicologo p WHERE EXISTS ( SELECT * FROM certificado c WHERE c.id inscricao = p.id_psicologo );
  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”.

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

NÃO CAIA NESSA!

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

c.id_inscricao = p.id_psicologo (chaves de tabelas diferentes)

i.id_psicologo = p.id_psicologo (chave que relaciona psicólogo à inscrição)

Tabelas envolvidas

Apenas PSICOLOGO e CERTIFICADO (sem INSCRICAO)

PSICOLOGO, INSCRICAO e CERTIFICADO (com JOIN entre INSCRICAO e CERTIFICADO)

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 id_inscricao igual ao id_psicologo (sem sentido lógico)

Verifica existência de certificado para inscrições do psicólogo (correto)

Item — ❌ ERRADO

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