FC ConcursosFC Concursos

Questão FC295916

Qual consulta permite recuperar do banco de dados os nomes dos jogadores que não têm contratos em vigência?

Linguagem SQL

CESGRANRIO · 2018

Considere as informações a seguir para responder a questão.

 

O esquema relacional a seguir é usado por uma federação de futebol para registrar contratos que jogadores têm com clubes que disputam os campeonatos organizados pela federação. Esse esquema é usado para gerenciar um banco de dados com as seguintes características:

 

• a tabela CONTRATO implementa uma relação de N:M entre jogadores e clubes;

• um contrato possui data de início (DATA_INI) e data de término (DATA_FIM);

• um jogador pode ter no máximo um contrato em vigência;

• contratos em vigência são caracterizados pela ausência de valor (NULL) na coluna DATA_FIM;

• alguns jogadores, por serem recém-promovidos das categorias de base, podem não ter contrato algum registrado no banco de dados.

 

CREATE TABLE JOGADOR (

NUM_CPF NUMBER(11) NOT NULL,

NOME VARCHAR2(50) NOT NULL,

CONSTRAINT JOGADOR_PK PRIMARY KEY (NUM_CPF) )

 

CREATE TABLE CLUBE (

NUM_CNPJ NUMBER(14) NOT NULL,

NOME VARCHAR2(50) NOT NULL,

CONSTRAINT CLUBE_PK PRIMARY KEY (NUM_CNPJ) )

 

CREATE TABLE CONTRATO (

NUM_CPF NUMBER(11) NOT NULL,

NUM_CNPJ NUMBER(14) NOT NULL,

DATA_INI DATE NOT NULL,

DATA_FIM DATE,

VALOR NUMBER(11,2) NOT NULL,

CONSTRAINT CONTRATO_PK PRIMARY KEY (NUM_CPF,NUM_CNPJ),

CONSTRAINT CONTRATO_FK1 FOREIGN KEY (NUM_CPF)

REFERENCES JOGADOR (NUM_CPF),

CONSTRAINT CONTRATO_FK2 FOREIGN KEY (NUM_CNPJ)

REFERENCES CLUBE (NUM_CNPJ) )

 

 

Qual consulta permite recuperar do banco de dados os nomes dos jogadores que não têm contratos em vigência?

  1. SELECT DISTINCT J.NOME

    FROM JOGADOR J

    LEFT JOIN CONTRATO C ON J.NUM_CPF=C.NUM_CPF

    WHERE DATA_FIM IS NOT NULL

  2. SELECT J.NOME

    FROM JOGADOR J

    WHERE J.NUM_CPF NOT IN

    (SELECT NUM_CPF FROM CONTRATO WHERE DATA_FIM IS NULL)

  3. SELECT DISTINCT J.NOME

    FROM JOGADOR J, CONTRATO C

    WHERE J.NUM_CPF=C.NUM_CPF AND C.NUM_CPF NOT IN

    (SELECT NUM_CPF FROM CONTRATO WHERE DATA_FIM IS NULL)

  4. SELECT J.NOME

    FROM JOGADOR J

    MINUS

    SELECT J.NOME FROM JOGADOR J, CONTRATO C

    WHERE J.NUM_CPF=C.NUM_CPF AND DATA_FIM IS NOT NULL

  5. SELECT DISTINCT J.NOME

    FROM JOGADOR J, CONTRATO C

    WHERE J.NUM_CPF=C.NUM_CPF AND DATA_FIM IS NOT NULL

Mostrar resposta e comentário

Gabarito

B

Comentário do professor

A consulta usa uma subconsulta para identificar os CPFs dos jogadores com contrato em vigência (ou seja, aqueles com DATA_FIM IS NULL). Essa subconsulta retorna exatamente os valores de NUM_CPF da tabela CONTRATO que representam contratos ativos.

Em seguida, a cláusula WHERE J.NUM_CPF NOT IN ( ... ) faz a exclusão desses CPFs do conjunto de todos os jogadores da tabela JOGADOR. Assim, permanecem os jogadores cujo CPF não aparece entre os que têm contrato ativo.

Importante: como CONTRATO.NUM_CPF é definido como NOT NULL, a subconsulta não retorna valores NULL, evitando problemas semânticos do operador NOT IN. Logo, o resultado inclui tanto jogadores com contratos encerrados quanto os que nunca tiveram contrato registrado.

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

Continue aprendendo