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?
- SELECT DISTINCT J.NOME
FROM JOGADOR J
LEFT JOIN CONTRATO C ON J.NUM_CPF=C.NUM_CPF
WHERE DATA_FIM IS NOT NULL
- SELECT J.NOME
FROM JOGADOR J
WHERE J.NUM_CPF NOT IN
(SELECT NUM_CPF FROM CONTRATO WHERE DATA_FIM IS NULL)
- 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)
- 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
- 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