FC ConcursosFC Concursos

Questão FC295902

Qual consulta SQL executa o que foi pedido?

Linguagem SQL

CESGRANRIO · 2019

O esquema relacional a seguir define um banco de dados, que contém os resultados das provas de natação dos Jogos Pan-americanos de 2019. Os nomes das tabelas e dos campos são autoexplicativos, permitindo, assim, entender a organização dos dados. As únicas exceções são os campos TEMPO_INDV e TEMPO, presentes na tabela RESULTADO. Eles existem porque em provas de revezamento são registrados os tempos (TEMPO_INDV) de cada um dos 4 membros da equipe e o tempo total (TEMPO) gasto pela equipe para completar a prova. Em provas individuais, o campo TEMPO_INDV recebe o valor nulo (NULL), enquanto o tempo gasto pelo atleta para completar a prova é registrado no campo TEMPO.

 

CREATE TABLE ATLETA (

NUMERO NUMBER(5,0) NOT NULL,

NOME VARCHAR2(50) NOT NULL,

PAIS CHAR(3) NOT NULL,

CONSTRAINT ATLETA_PK PRIMARY KEY (NUMERO))

 

CREATE TABLE PROVA (

CODIGO CHAR(5) NOT NULL,

DESCRICAO VARCHAR2(30) NOT NULL,

CONSTRAINT PROVA_PK PRIMARY KEY (CODIGO))

 

CREATE TABLE RESULTADO (

NUM_ATL      NUMBER(5,0) NOT NULL,

COD_PRV      CHAR(5) NOT NULL,

COLOCACAO NUMBER(2,0) NOT NULL,

TEMPO_INDV VARCHAR2(8),

TEMPO      VARCHAR2(8) NOT NULL,

CONSTRAINT RESULTADO_PK PRIMARY KEY (NUM_ATL,COD_PRV),

CONSTRAINT RES_FK1 FOREIGN KEY (NUM_ATL)

REFERENCES ATLETA (NUMERO),

CONSTRAINT RES_FK2 FOREIGN KEY (COD_PRV)

REFERENCES PROVA (CODIGO))

 

 

Deseja-se conhecer os nomes dos nadadores brasileiros (PAIS='BRA') que conquistaram medalhas de ouro (COLOCACAO=1), juntamente com a quantidade de medalhas de ouro que cada um conquistou. Os dados devem estar ordenados em ordem decrescente de número de medalhas conquistadas.

 

Qual consulta SQL executa o que foi pedido?

  1. SELECT A.NOME, COUNT(*)

    FROM ATLETA A, RESULTADO R

    WHERE A.NUMERO=R.NUM_ATL AND R.COLOCACAO=1 AND A.PAIS='BRA'

    GROUP BY A.NUMERO

    ORDER BY COUNT(*) DESC

  2. SELECT A.NOME, COUNT(*)

    FROM RESULTADO R, ATLETA A

    WHERE A.NUMERO=R.NUM_ATL AND R.COLOCACAO=1 AND A.PAIS='BRA'

    ORDER BY COUNT(R.COLOCACAO) DESC

  3. SELECT NOME, COUNT(*)

    FROM RESULTADO, ATLETA

    WHERE NUMERO=NUM_ATL AND COLOCACAO=1 AND PAIS='BRA'

    GROUP BY NOME

    ORDER BY COUNT(*) DESC

  4. SELECT A.NOME, COUNT(*)

    FROM ATLETA A, RESULTADO R

    HAVING A.NUMERO=NUM_ATL AND R.COLOCACAO=1 AND A.PAIS='BRA'

    GROUP BY A.NOME

    ORDER BY COUNT(*) DESC

  5. SELECT A.NOME, COUNT(*)

    FROM ATLETA A, RESULTADO R

    WHERE A.NUMERO=NUM_ATL AND R.COLOCACAO=1

    GROUP BY A.NOME

    HAVING A.PAIS='BRA'

    ORDER BY COUNT(*) DESC

Mostrar resposta e comentário

Gabarito

Certo

Comentário do professor

A consulta selecionada: SELECT NOME, COUNT(*) ... GROUP BY NOME ... ORDER BY COUNT(*) DESC traz exatamente o pedido: o nome do atleta e a quantidade de ouros que conquistou.

O COUNT(*) agrega o número de linhas (medalhas) por nadador; por isso é necessário o GROUP BY em NOME para obter a contagem por atleta.

A junção entre tabelas é feita na cláusula WHERE por NUMERO = NUM_ATL, pois RESULTADO.NUM_ATL referencia ATLETA.NUMERO (chave estrangeira).

Os filtros COLOCACAO = 1 e PAIS = 'BRA' garantem que só sejam contados ouros e apenas atletas brasileiros.

Por fim, ORDER BY COUNT(*) DESC apresenta os atletas em ordem decrescente do número de ouros, atendendo ao requisito de ordenação.

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

Continue aprendendo