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
qa630750
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.   Para se selecionarem os nomes dos psicólogos e os nomes dos cursos que eles concluíram, cuja data do certificado seja superior a ‘2023‑01‑01’, deve‑se executar a instrução SQL a seguir. SELECT nome_curso, nome FROM curso c JOIN inscricao i ON c.id_curso = i . id_curso JOIN psicologo p ON i.id_psicologo = p .id_psicologo WHERE data_certificado > '2023-01-01';
  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”.

Consultas SQL com JOIN e filtro em coluna de outra tabela

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.

NÃO CAIA NESSA!

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.

Item — ❌ Errado

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