Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas e Comandos em SQL
Código
fg165200
Banca
FGV
Órgão
TJ AP
Ano
2024
Cargo
AJ ( )

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.

 

Competidor

 
Nome
A
B
c
D
E
F
 

Disputa

 

Azul

Verde

AB
CA
BA
CE
FA
FD
 

Considerando as tabelas Competidor e Disputa, descritas anteriormente, analise os três comandos SQL a seguir.

 

I. select C.nome

 from Competidor C

 where exists (select * from Disputa D

               where D.azul = C.nome)

and exists (select * from Disputa D

               where D.verde = C.nome)

 

II. select C.nome

  from Competidor C

  where exists (select * from Disputa D

                where D.azul = C.nome

                   or D.verde = C.nome)

 

III. select C.nome

  from Competidor C

  where (select count(*) from Disputa D

         where D.azul = C.nome)

      + (select count(*) from Disputa D

         where D.verde = C.nome) > 1

 

O resultado

 
Nome
A
B
 

é obtido somente no(s) comando(s):

  1. AI;
  2. BII;
  3. CIII;
  4. DI e II;
  5. EII e III.
Revelar gabarito e comentário

GabaritoA — I;

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”.

Consultas SQL com EXISTS e COUNT: Semântica de Correlação

Gabarito: letra A. Apenas o comando I retorna exatamente os competidores A e B — ele exige que o competidor apareça ao mesmo tempo como azul e como verde em disputas (dois EXISTS correlacionados unidos por AND). O comando II retorna qualquer competidor que apareça em pelo menos uma disputa (OR), e o III retorna competidores cuja soma de participações como azul e como verde seja maior que 1 — ambos incluem mais nomes que A e B.

A questão testa a diferença sutil entre três formas de correlacionar uma subconsulta com a consulta externa: o EXISTS (que testa existência de pelo menos uma linha) e o COUNT (que conta linhas). A pegadinha está em perceber que o comando III, apesar de parecer equivalente ao I, conta participações, não cores distintas — um competidor que aparece duas vezes como azul e zero como verde tem soma 2 > 1 e é incluído, mesmo nunca tendo sido verde.

Vamos montar as tabelas para visualizar:

Competidor: A, B, c, D, E, F

Disputa (Azul, Verde): (A,B), (C,A), (B,A), (C,E), (F,A), (F,D)

Agora, para cada competidor, vamos contar quantas vezes ele aparece como azul e como verde:

Competidor

Aparições como Azul

Aparições como Verde

Total

A

3 (A,B; C,A; F,A)

2 (C,A; B,A)

5

B

1 (B,A)

1 (A,B)

2

c

2 (C,A; C,E)

0

2

D

0

1 (F,D)

1

E

0

1 (C,E)

1

F

1 (F,A; F,D)

0

2

Comando I: EXISTS azul AND EXISTS verde. Retorna competidores que têm pelo menos uma aparição como azul e pelo menos uma como verde. Isso vale para A (3 azuis, 2 verdes) e B (1 azul, 1 verde). Os demais não têm as duas cores. Resultado: A, B.

Comando II: EXISTS azul OR EXISTS verde. Retorna competidores que aparecem em qualquer disputa, independentemente da cor. Isso inclui A, B, c, D, E, F — todos os que têm pelo menos uma aparição. Resultado: A, B, c, D, E, F.

Comando III: soma dos COUNTs > 1. Retorna competidores cujo total de participações (azul + verde) seja maior que 1. Isso inclui A (5), B (2), c (2) e F (2). Resultado: A, B, c, F.

A diferença crucial entre I e III: o comando I exige que o competidor tenha ambas as cores; o comando III apenas exige que ele tenha mais de uma participação no total, mesmo que todas sejam da mesma cor. O competidor c tem 2 participações como azul e 0 como verde — passa no III, mas não no I. O competidor F tem 2 participações como azul e 0 como verde — idem.

NÃO CAIA NESSA!

A banca explora a confusão entre "participar de disputas com as duas cores" e "participar de mais de uma disputa". O comando III parece equivalente ao I, mas conta participações, não cores distintas. O competidor c (2 azuis, 0 verdes) e o F (2 azuis, 0 verdes) são incluídos no III, mas não no I. Fique atento: COUNT(*) soma linhas, não valores distintos.

Alternativa A — ✅ Correta ⟵ GABARITO

O comando I usa dois EXISTS correlacionados unidos por AND. O primeiro verifica se existe pelo menos uma disputa em que o competidor é azul; o segundo, se existe pelo menos uma em que é verde. Apenas A e B satisfazem ambas as condições. É a implementação clássica da consulta "competidores que participaram com as duas cores".

Alternativa B — ❌ Incorreta

O comando II usa OR entre os dois EXISTS. Isso significa que basta o competidor aparecer em qualquer disputa, seja como azul ou como verde, para ser retornado. O resultado inclui A, B, c, D, E, F — todos os que têm pelo menos uma participação. Não corresponde ao resultado esperado (A e B).

Alternativa C — ❌ Incorreta

O comando III soma os COUNT(*) de participações como azul e como verde e filtra por soma > 1. Isso retorna competidores com mais de uma participação total, independentemente da cor. Inclui A (5), B (2), c (2) e F (2). O competidor c e o F nunca foram verdes, mas têm 2 participações como azul, então passam no filtro. Não corresponde ao resultado esperado.

Alternativa D — ❌ Incorreta

A combinação I e II estaria correta se ambos os comandos retornassem o mesmo resultado. Mas o comando II retorna todos os competidores com qualquer participação (A, B, c, D, E, F), enquanto o I retorna apenas A e B. Portanto, não são equivalentes.

Alternativa E — ❌ Incorreta

A combinação II e III também não é correta, pois ambos retornam mais que A e B. O II retorna todos os competidores com participação; o III retorna os que têm mais de uma participação total. Nenhum deles coincide com o resultado esperado.

Gabarito: letra A

Link permanente: /questoes/fg165200