Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas 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
A
B
C
A
B
A
C
E
F
A
F
D
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):
AI;
BII;
CIII;
DI e II;
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.
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 ANDEXISTS verde. Retorna competidores que têm pelo menos uma aparição como azul epelo 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 OREXISTS 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.