FC ConcursosFC Concursos

Questão FC295908

Qual consulta exibe a matrícula e o nome dos alunos que se inscreveram em pelo menos um exame simulado?

Linguagem SQL

CESGRANRIO · 2018

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?

  1. SELECT A.MATRICULA, A.NOME      FROM             ALUNO A LEFT JOIN PARTICIPACAO P ON A.MATRICULA = P.MATRICULA      GROUP BY A.MATRICULA, A.NOME
  2. 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
  3. 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
  4. SELECT A.MATRICULA, A.NOME      FROM ALUNO A           WHERE A.MATRICULA IN                     (SELECT P.MATRICULA FROM PARTICIPACAO P)
  5. SELECT A.MATRICULA, A.NOME      FROM ALUNO A           WHERE (SELECT COUNT(*) FROM PARTICIPACAO P                      WHERE A.MATRICULA=P.MATRICULA AND P.PONTOS!=0) > 0
Mostrar resposta e comentário

Gabarito

D

Comentário do professor

A consulta SELECT A.MATRICULA, A.NOME FROM ALUNO A WHERE A.MATRICULA IN (SELECT P.MATRICULA FROM PARTICIPACAO P) busca diretamente os alunos cuja matrícula aparece na tabela PARTICIPACAO.

A cláusula IN compara cada matrícula da tabela ALUNO com o conjunto retornado pela subconsulta (SELECT P.MATRICULA FROM PARTICIPACAO P), ou seja, verifica a existência de pelo menos uma inscrição do aluno em algum simulado.

Como a tabela PARTICIPACAO registra uma linha para cada inscrição, a presença da matrícula nessa tabela implica que o aluno inscreveu-se em ≥1 simulado. Não há filtro sobre pontos, portanto todos os inscritos são incluídos.

Observação: a subconsulta devolve um conjunto de valores, então não é necessário usar DISTINCT — a cláusula IN trata corretamente as duplicatas.

Conteúdo do catálogo FC Concursos · Atualizado em

Continue aprendendo