Num banco de dados relacional, considere a tabela Vencedores...

Próximas questões
Com base no mesmo assunto
Q2096190 Banco de Dados

Num banco de dados relacional, considere a tabela Vencedores, cuja instância é exibida a seguir, com duas colunas, Tenista e Torneio, que representam alguns torneios que já foram vencidos por alguns tenistas.

Tenista                         Torneio

Roger Federer             Australian Open

Roger Federer             Roland Garros

Roger Federer             Wimbledon

Roger Federer             US Open

Pete Sampras             US Open

Pete Sampras             Wimbledon

Pete Sampras             Australian Open

Bjorn Borg                   Roland Garros

Bjorn Borg                    Wimbledon


Maria precisa escrever um comando SQL que liste os tenistas que venceram todos os torneios mencionados na coluna Torneio. O comando deve valer para qualquer instância válida da tabela, que pode conter diferentes tenistas e diferentes torneios.


Assinale o comando que Maria deve usar. 

Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

A questão exige conhecimentos a respeito dos comandos do SQL. Vejamos:

Maria precisa escrever um comando SQL que liste os tenistas que venceram todos os torneios mencionados na coluna Torneio. O comando deve valer para qualquer instância válida da tabela, que pode conter diferentes tenistas e diferentes torneios.

select distinct Tenista from Vencedores v1 -

Esse comando retorna somente os nomes dos tenistas que atendem aos critérios.

where not exists( - Esse comando verifica se não há nenhum tenista na subconsulta intermediária (v2) que participou de um torneio em que o tenista da consulta (v1) não participou.

select * from Vencedores v2 - Esse comando irá retornar todos os registros da tabela Vencedores.

where not exists ( - Esse comando verifica se não existe nenhum registro na tabela Vencedores

select * from Vencedores v3 - Esse comando é utilizado para verificar se algum tenista venceu um torneio específico.

where v2.Torneio = v3.Torneio

and v1.Tenista = v3.Tenista)) - Nesse caso, é uma subconsulta interna. Esse comando irá criar uma terceira tabela, v3, e compara o torneio e o tenista da subconsulta v2 com o da subconsulta v3.

Veja:

Maria precisa escrever um comando SQL para remover tenistas que não tenham vencido algum torneio. Nesse sentido, restou apenas os que venceram todos os torneios.

Podemos afirmar que as alternativas A,B,C, e D estão incorretas, pois os comandos não correspondem ao que a questão se refere.

Gabarito do monitor: LETRA E


Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

LETRA E

Vou tentar explicar a questão de um forma interpretativa, em vez de técnica, acho que ajudará mais.

B e D, possuem erros de sintaxe e A não atende ao proposto e isso é fácil de ser validado.

Logo temos C e E:

O que a questão nos pede que "liste os tenistas que venceram todos os torneios mencionados na coluna Torneio.", não são todos os tenistas que venceram, mas todos os tenistas que venceram os torneios listados na coluna Torneios. Então para isso eu preciso controlar os Torneios e os Tenistas e preciso compará-los com uma tabela de referência, logo podemos assumir que serão necessárias 3 instâncias de uma mesma tabela, o que nos leva a alternativa E.

Enfim, essa é uma explicação a nível de interpretação do problema e não a nível de resolução de técnica de query. Para esse tipo de query que a FGV adora cobrar é importante termos essa visão.

olá. Obrigado pela resolução. Onde está o erro de sintase da b e da d?

Prezado coleguinha, caso queira entender verdadeiramente a viagem da nossa ilustríssima FGV, leia com paciência.

O conceito por trás dessa consulta é chamado como "relação de divisão" ou "divisão condicional" em álgebra relacional. A operação é comumente usada para encontrar registros que estão relacionados a todos os registros de um segundo conjunto.

Tradicionalmente, a divisão na álgebra relacional não é suportada e, por conseguinte, não tem uma cláusula correspondente em SQL. No entanto, é possível expressar a operação em SQL usando outras.

Essa consulta, não está tentando buscar tenistas que venceram em todos os torneios, mas sim tenistas que venceram em pelo menos um torneio em comum com qualquer outro tenista.

Se houver uma diferença em Torneio para um determinado Tenista, a consulta não retornará nada e, portanto, a condição NOT EXISTS será verdadeira para todos os tenistas, levando a nenhum resultado.

Essa abordagem com NOT EXISTS cria uma condição de "para todo" (forall) na qual está verificando se não existe nenhum torneio onde o tenista da subconsulta externa não compartilhe a vitória com todos os tenistas da subconsulta intermediária.

A subconsulta mais interna (v3), por sua vez, está verificando se há pelo menos um torneio em que os tenistas da subconsulta externa (v1.Tenista) e da subconsulta intermediária (v2.Tenista) compartilham a vitória.

Algumas fontes:

https://www.geeksforgeeks.org/sql-division/

https://www.red-gate.com/simple-talk/databases/sql-server/learn/high-performance-relational-division-in-sql-server/#:~:text=Relational%20division%20is%20used%20in,before%20applying%20the%20final%20logic.

Divirtam-se

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo