Questão de Banco de Dados — Consultas e Comandos em SQL — Quadrix 2024
- Código
- qa630750
- Banca
- Quadrix
- Órgão
- CFP
- Ano
- 2024
- Cargo
- Ana Tec ( )
- CCerto
- EErrado
GabaritoE — Errado
Gabarito: ERRADO (letra E). A instrução SQL está incorreta porque a coluna data_certificado pertence à tabela CERTIFICADO, que não é incluída na consulta por meio de um JOIN. Para que o filtro WHERE data_certificado > '2023-01-01' funcione, seria necessário adicionar um JOIN com a tabela CERTIFICADO, relacionando-a à tabela INSCRICAO pela chave estrangeira id_inscricao.
A linguagem SQL é a linguagem padrão para acesso e manipulação de bancos de dados relacionais. Ela é uma linguagem declarativa, ou seja, o usuário especifica qual resultado deseja, sem precisar dizer como obtê-lo — essa decisão fica com o SGBD. A consulta apresentada no enunciado é uma consulta de recuperação de dados, que em SQL é feita com o comando SELECT. A estrutura básica de um SELECT envolve as cláusulas SELECT (colunas desejadas), FROM (tabelas de origem) e, opcionalmente, WHERE (filtro de linhas) e JOIN (combinação de tabelas).
O ponto central desta questão é a necessidade de incluir todas as tabelas que fornecem colunas usadas na consulta. Quando uma consulta faz referência a uma coluna, essa coluna deve estar disponível no conjunto de tabelas que estão sendo consultadas — seja diretamente no FROM, seja por meio de um JOIN. No caso, a consulta tenta selecionar nome_curso e nome das tabelas curso, inscricao e psicologo, mas o filtro WHERE usa data_certificado, que é uma coluna da tabela certificado. Como essa tabela não é unida, o SGBD não reconhecerá a coluna e a consulta falhará com um erro de sintaxe ou de execução.
Para entender melhor, vamos analisar a estrutura do banco de dados. Temos as tabelas PSICOLOGO, CURSO, INSCRICAO e CERTIFICADO. A tabela INSCRICAO faz a ligação entre psicólogos e cursos, e a tabela CERTIFICADO está relacionada a cada inscrição. Para obter os nomes dos psicólogos e dos cursos que eles concluíram, com certificado emitido após uma data específica, precisamos unir todas as quatro tabelas. A consulta correta seria algo como:
SELECT p.nome, c.nome_curso
FROM psicologo p
JOIN inscricao i ON p.id_psicologo = i.id_psicologo
JOIN curso c ON i.id_curso = c.id_curso
JOIN certificado cert ON i.id_inscricao = cert.id_inscricao
WHERE cert.data_certificado > '2023-01-01';A pegadinha da banca está em omitir o JOIN com a tabela CERTIFICADO, fazendo o candidato acreditar que a coluna data_certificado está disponível apenas por estar no banco de dados. Em SQL, a disponibilidade de uma coluna depende das tabelas que estão sendo consultadas, não do esquema global do banco.
A banca explora a confusão entre ter a coluna no banco e ter a coluna disponível na consulta. O candidato pode pensar que, como a tabela CERTIFICADO existe, a coluna data_certificado pode ser usada diretamente. Mas, sem o JOIN, a coluna não está no escopo da consulta, e o SGBD retornará um erro. Lembre-se: toda coluna usada no SELECT ou no WHERE deve vir de uma tabela presente no FROM ou em um JOIN.
A instrução SQL apresentada está incorreta porque faz referência à coluna data_certificado sem incluir a tabela CERTIFICADO na consulta. O SELECT une apenas as tabelas curso, inscricao e psicologo, mas o filtro WHERE usa uma coluna de uma quarta tabela que não foi unida. Isso gera um erro de execução, pois o SGBD não reconhece a coluna data_certificado no contexto da consulta. Para corrigir, seria necessário adicionar um JOIN com a tabela CERTIFICADO, relacionando-a à tabela INSCRICAO pela chave estrangeira id_inscricao, e qualificar a coluna no WHERE (ex.: cert.data_certificado).
Gabarito: letra E (ERRADO).
Link permanente: /questoes/qa630750