FC ConcursosFC Concursos

Questão FC295915

Qual consulta permite recuperar do banco de dados várias linhas contendo, cada uma delas, o nome do jogador, o nome do clube e o valor do contrato, em vigência ou já encerrado, em

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) )

 

 

Seja MV o maior valor de contrato existente no banco de dados da federação. Admita que possa haver vários contratos com o mesmo valor.

 

Qual consulta permite recuperar do banco de dados várias linhas contendo, cada uma delas, o nome do jogador, o nome do clube e o valor do contrato, em vigência ou já encerrado, em que o valor do contrato seja igual a MV?

  1. SELECT J.NOME, C.NOME, MAX(T.VALOR)

    FROM JOGADOR J, CLUBE C, CONTRATO T

    WHERE J.NUM_CPF=T.NUM_CPF AND T.NUM_CNPJ=C.NUM_CNPJ

    GROUP BY J.NOME, C.NOME

  2. SELECT J.NOME, C.NOME, MAX(T.VALOR)

    FROM JOGADOR J, CLUBE C, CONTRATO T

    WHERE J.NUM_CPF=T.NUM_CPF AND T.NUM_CNPJ=C.NUM_CNPJ

  3. SELECT J.NOME, C.NOME, MAX(T.VALOR)

    FROM JOGADOR J, CLUBE C, CONTRATO T

    WHERE J.NUM_CPF=T.NUM_CPF AND T.NUM_CNPJ=C.NUM_CNPJ

    HAVING T.VALOR=MAX(T.VALOR)

    GROUP BY J.NOME, C.NOME

  4. SELECT J.NOME, C.NOME, T.VALOR

    FROM JOGADOR J, CLUBE C, CONTRATO T

    WHERE J.NUM_CPF=T.NUM_CPF AND T.NUM_CNPJ=C.NUM_CNPJ AND

    T.VALOR = (SELECT MAX(VALOR)FROM CONTRATO)

  5. SELECT J.NOME, C.NOME, MAX(T.VALOR)

    FROM JOGADOR J, CLUBE C, CONTRATO T

    WHERE J.NUM_CPF=T.NUM_CPF AND T.NUM_CNPJ=C.NUM_CNPJ AND

    T.VALOR=MAX(T.VALOR)

Mostrar resposta e comentário

Gabarito

D

Comentário do professor

A consulta correta utiliza uma subconsulta para obter o valor máximo global dos contratos, isto é \(MV = \max(\text{VALOR})\), e em seguida filtra as tuplas de CONTRATO que possuem esse mesmo valor.

O trecho (SELECT MAX(VALOR) FROM CONTRATO) calcula \(MV\). A cláusula WHERE externa compara T.VALOR = esse resultado, garantindo que sejam retornados todos os contratos cujo valor é igual a \(MV\).

As condições J.NUM_CPF=T.NUM_CPF e T.NUM_CNPJ=C.NUM_CNPJ fazem o JOIN entre as três tabelas, permitindo projetar J.NOME, C.NOME, T.VALOR para cada contrato correspondente.

Como não há cláusula de agrupamento, a consulta traz todas as ocorrências empatadas no maior valor e não filtra por DATA_FIM, portanto inclui contratos vigentes (DATA_FIM NULL) e encerrados. Jogadores sem contrato não aparecem, pois não existem tuplas em CONTRATO para relacioná‑los.

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

Continue aprendendo