Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2024

Banco de DadosSQL
Código
fg098197
Banca
FGV
Órgão
TJ-AP
Ano
2024
Nível
Superior
Cargo
Apoio Especializado - Tecnologia da Informação - Desenvolvimento de Sistemas
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.


Imagem da questão
João tem pouca experiência com SQL, mas precisa de uma consulta que exiba os competidores que têm o mesmo número de disputas com as camisas azul e verde. João escreveu três scripts, utilizando as tabelas Competidor e Disputa, como definidas anteriormente, e tentou a sorte.Imagem associada para resolução da questãoDado que a resposta correta deve exibir somente o competidor B, conclui-se que:
  1. Anenhum dos scripts funciona;
  2. Bsomente o primeiro script funciona;
  3. Csomente o segundo script funciona;
  4. Dsomente o terceiro script funciona;
  5. Eos três scripts funcionam.
Revelar gabarito e comentário

GabaritoC — somente o segundo script funciona;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL: subconsultas correlacionadas e contagem condicional

Gabarito: letra C — somente o segundo script funciona. O primeiro script usa COUNT(DISTINCT ...) sem correlação com o competidor, retornando sempre o mesmo valor para todos e nunca satisfazendo o HAVING; o terceiro script possui erro de sintaxe, pois as subconsultas não possuem a cláusula FROM. Apenas o segundo script correlaciona corretamente as subconsultas ao competidor externo, contando as aparições como azul e como verde e comparando os totais.

A questão exige compreender como subconsultas correlacionadas funcionam em SQL. Uma subconsulta correlacionada é aquela que referencia uma coluna da consulta externa (no caso, C.nome), fazendo com que a subconsulta seja avaliada para cada linha da consulta externa. Isso permite contar, para cada competidor, quantas vezes ele aparece na tabela Disputa como camisa azul e quantas vezes como camisa verde, e então comparar esses valores.

O primeiro script tenta usar COUNT(DISTINCT ...) dentro de uma subconsulta, mas sem correlacionar com o competidor externo. Isso significa que a subconsulta conta valores distintos de d.azul e d.verde para a tabela Disputa inteira, retornando sempre o mesmo número (por exemplo, 4) para todos os competidores. Como a condição HAVING compara esses dois valores constantes, ela será verdadeira para todos ou para nenhum, mas nunca para um competidor específico. O resultado é vazio, pois a condição COUNT(DISTINCT d.azul) = COUNT(DISTINCT d.verde) é verdadeira para todos, mas o HAVING sem GROUP BY trata a consulta como um único grupo, e a condição COUNT(DISTINCT d.azul) = COUNT(DISTINCT d.verde) é verdadeira, então retornaria todos os competidores, não apenas B. Na verdade, o HAVING sem GROUP BY é aplicado a toda a tabela, e como a condição é verdadeira, retornaria todos os competidores, o que não atende ao requisito.

O segundo script usa duas subconsultas correlacionadas: uma que conta quantas vezes o competidor aparece como azul (SUM(1) ... WHERE D.azul = C.nome) e outra que conta quantas vezes aparece como verde (SUM(1) ... WHERE D.verde = C.nome). A função SUM(1) soma o valor constante 1 para cada linha encontrada, funcionando de forma similar a COUNT(*). A diferença é que, se nenhuma linha for encontrada, SUM(1) retorna NULL, enquanto COUNT(*) retorna 0. No entanto, como a comparação é de igualdade, NULL = NULL é avaliado como desconhecido, e a linha não é retornada. Portanto, apenas competidores que têm o mesmo número de aparições como azul e como verde (e que aparecem pelo menos uma vez em cada cor) são retornados. No caso, apenas o competidor B atende a essa condição.

O terceiro script possui erro de sintaxe: as subconsultas não possuem a cláusula FROM. A sintaxe correta seria (SELECT COUNT(*) FROM Disputa D WHERE D.azul = C.nome). Sem o FROM, o comando é inválido e não executa.

Portanto, a resposta correta é a alternativa C.

Alternativa A — ❌ Incorreta

Afirma que nenhum dos scripts funciona. Isso é falso, pois o segundo script funciona corretamente e retorna apenas o competidor B.

Alternativa B — ❌ Incorreta

Afirma que somente o primeiro script funciona. O primeiro script não funciona, pois o COUNT(DISTINCT ...) sem correlação retorna valores constantes para todos os competidores, não atendendo ao requisito de exibir apenas o competidor B.

Alternativa C — ✅ Correta ⟵ GABARITO

O segundo script funciona corretamente. Ele usa subconsultas correlacionadas para contar, para cada competidor, o número de aparições como azul e como verde, e compara esses totais. Apenas o competidor B tem o mesmo número de aparições nas duas cores, então apenas ele é retornado.

Alternativa D — ❌ Incorreta

Afirma que somente o terceiro script funciona. O terceiro script possui erro de sintaxe, pois as subconsultas não possuem a cláusula FROM, tornando o comando inválido.

Alternativa E — ❌ Incorreta

Afirma que os três scripts funcionam. Isso é falso, pois o primeiro script não retorna apenas o competidor B e o terceiro script possui erro de sintaxe.

Gabarito: letra C

Link permanente: /questoes/fg098197