Questão nº 41
Questão de Tecnologia da Informação · FGV TJ-AP 2024 (nº 41)
Quando referenciadas, considere as tabelas relacionais Competidor e Disputa, cujas estruturas e instâncias são descritas abaixo. Todas as colunas são definidas como strings.
A tabela Disputa contém as disputas realizadas entre competidores que aparecem na tabela Competidor. Em cada disputa há dois competidores, um com camisa azul e outro com camisa verde.
Considerando as tabelas Competidor e Disputa, descritas anteriormente, analise o comando SQL a seguir.
select *
from competidor c, disputa d
where (c.nome = d.azul and c.nome = d.verde)
or (c.nome = d.verde and c.nome = d.azul)
O número de linhas produzidas pela execução desse comando, sem contar a linha de títulos, é:
- A0; (alternativa correta)
- B1;
- C6;
- D18;
- E36.
Resposta comentada
Gabarito Alternativa A
Um JOIN em SQL combina linhas de duas ou mais tabelas. Quando não especificamos um tipo de JOIN (como INNER JOIN ou LEFT JOIN) e listamos as tabelas separadas por vírgula no FROM, o SQL realiza um CROSS JOIN (produto cartesiano), que gera todas as combinações possíveis de linhas entre as tabelas. A cláusula WHERE é usada para filtrar essas linhas combinadas, mantendo apenas aquelas que satisfazem a condição especificada.
- (A) Correta: O comando SQL realiza um CROSS JOIN entre as 6 linhas da tabela Competidor e as 3 linhas da tabela Disputa, resultando em 6 * 3 = 18 linhas intermediárias. A condição
where (c.nome = d.azul and c.nome = d.verde) or (c.nome = d.verde and c.nome = d.azul)pode ser simplificada parac.nome = d.azul AND c.nome = d.verde. Para que essa condição seja verdadeira, o nome do competidor (c.nome) deve ser igual ao nome do competidor de camisa azul (d.azul) E também igual ao nome do competidor de camisa verde (d.verde) na mesma disputa. Isso implica qued.azulteria que ser igual ad.verde. Ao analisar a tabela Disputa, percebemos que em nenhuma das disputas o competidor de camisa azul é o mesmo que o competidor de camisa verde (d.azulé sempre diferente ded.verde). Como a condiçãod.azul = d.verdenunca é satisfeita, a cláusulaWHEREnunca será verdadeira para nenhuma das 18 linhas combinadas, resultando em 0 linhas no resultado final. - (B) Incorreta: Não há nenhuma linha que satisfaça a condição de que o competidor seja, ao mesmo tempo, o jogador de camisa azul e o de camisa verde em uma mesma disputa.
- (C) Incorreta: 6 é o número de competidores, mas a query não retorna esse número de linhas.
- (D) Incorreta: 18 seria o número de linhas se não houvesse a cláusula
WHERE(apenas o resultado do CROSS JOIN). A armadilha aqui é ignorar ou interpretar erroneamente a condição de filtro doWHERE. - (E) Incorreta: 36 não corresponde a nenhum cálculo lógico para esta query.
Fonte: FGV TJ-AP 2024 Analista Judiciário - TI - Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.
