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