Questão nº 61
Questão de Tecnologia da Informação · CESGRANRIO Transpetro PSP-RH-2018.1 (nº 61)
As Tabelas a seguir fazem parte do esquema de um banco de dados de uma escola de nível médio, que deseja controlar os resultados de seus alunos nos exames simulados do ENEM.
CREATE TABLE ALUNO ( MATRICULA NUMBER(5) NOT NULL, NOME VARCHAR2(50) NOT NULL, ANO NUMBER(1) NOT NULL, TURMA CHAR(1) NOT NULL, CONSTRAINT ALUNO_PK PRIMARY KEY (MATRICULA) ) CREATE TABLE SIMULADO ( CODIGO NUMBER(5) NOT NULL, DESCRICAO VARCHAR2(80) NOT NULL, DATA DATE NOT NULL, CONSTRAINT SIMULADO_PK PRIMARY KEY (CODIGO) ) CREATE TABLE PARTICIPACAO ( MATRICULA NUMBER(5) NOT NULL, CODIGO NUMBER(5) NOT NULL, PONTOS NUMBER(4), CONSTRAINT PART_PK PRIMARY KEY (MATRICULA,CODIGO), CONSTRAINT PART_FK1 FOREIGN KEY (MATRICULA) REFERENCES ALUNO (MATRICULA), CONSTRAINT PART_FK2 FOREIGN KEY (CODIGO) REFERENCES SIMULADO (CODIGO) )Considere que:
• A Tabela PARTICIPACAO registra a inscrição de alunos nos exames simulados promovidos pela escola. Um aluno pode inscrever-se em muitos simulados, e um simulado pode ter muitos alunos inscritos.
• Todas as vezes em que um aluno se inscrever em um simulado uma linha será inserida na tabela PARTICIPACAO.
• Após a correção de um simulado, os pontos obtidos pelos alunos inscritos são atualizados na tabela PARTICIPACAO.
Qual consulta exibe a matrícula e o nome dos alunos que se inscreveram em pelo menos um exame simulado?
- A```sql
SELECT A.MATRICULA, A.NOME
FROM
ALUNO A LEFT JOIN PARTICIPACAO P ON A.MATRICULA = P.MATRICULA
GROUP BY A.MATRICULA, A.NOME
``` - B```sql
SELECT A.MATRICULA, A.NOME
FROM ALUNO A,PARTICIPACAO P
WHERE A.MATRICULA=P.MATRICULA AND P.PONTOS != 0
GROUP BY A.MATRICULA, A.NOME
``` - C```sql
SELECT A.MATRICULA, A.NOME
FROM
ALUNO A RIGHT JOIN PARTICIPACAO P ON A.MATRICULA = P.MATRICULA
WHERE A.MATRICULA=P.MATRICULA AND P.PONTOS != 0
GROUP BY A.MATRICULA, A.NOME
``` - D```sql
SELECT A.MATRICULA, A.NOME
FROM ALUNO A
WHERE A.MATRICULA IN
(SELECT P.MATRICULA FROM PARTICIPACAO P)
``` (alternativa correta) - E```sql
SELECT A.MATRICULA, A.NOME
FROM ALUNO A
WHERE (SELECT COUNT(*) FROM PARTICIPACAO P
WHERE A.MATRICULA=P.MATRICULA AND P.PONTOS!=0) > 0
```
Resposta comentada
Gabarito Alternativa D
Conceito-chave: A tabela PARTICIPACAO guarda apenas alunos que se inscreveram em simulados. Para saber quem se inscreveu, basta verificar se a matrícula do aluno existe nessa tabela — não importa se ele tirou 0 pontos ou ainda não foi corrigido. O IN com subconsulta é a forma mais direta e segura de fazer isso.
- (A) Incorreta: O
LEFT JOINtraz todos os alunos, inclusive os que nunca se inscreveram (comP.MATRICULAnulo). Sem um filtroWHERE P.MATRICULA IS NOT NULL, a consulta retorna alunos sem inscrição, o que fere o requisito. - (B) Incorreta: O filtro
P.PONTOS != 0exclui alunos que se inscreveram mas tiraram 0 pontos (ou que ainda não foram corrigidos, comPONTOSnulo). A inscrição existe independentemente da pontuação. - (C) Incorreta: Mesmo erro da (B): o
P.PONTOS != 0elimina inscrições válidas com nota zero. Além disso, oRIGHT JOINcomWHERE A.MATRICULA = P.MATRICULAé redundante e não corrige o problema do filtro. - (D) Correta: A subconsulta
SELECT P.MATRICULA FROM PARTICIPACAO Pretorna todas as matrículas que possuem pelo menos uma inscrição. OINverifica se a matrícula do aluno está nesse conjunto, exibindo exatamente os alunos que se inscreveram em pelo menos um simulado, sem depender de pontos. - (E) Incorreta: A subconsulta correlacionada usa
P.PONTOS != 0, o que exclui alunos com nota zero ou nula. Mesmo que a contagem seja> 0, alunos com apenas inscrições sem pontuação (ou com 0 pontos) não seriam listados, contrariando o enunciado.
Armadilha da banca (no distrator mais tentador, a letra E): A pegadinha está no P.PONTOS != 0. Muitos alunos assumem que "participar" significa "ter nota", mas o enunciado diz que a linha em PARTICIPACAO é inserida no momento da inscrição, antes da correção. Portanto, PONTOS pode ser nulo ou 0, e ainda assim o aluno participou. A banca testa se você entende que a existência do registro é o que define a participação, não a pontuação.
Fonte: CESGRANRIO Transpetro PSP-RH-2018.1 Analista de Sistemas Júnior - Infraestrutura. Reproduzida para fins de estudo.