Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165201
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 o comando SQL a seguir.
select nome
from Competidor C
where not exists (select *
from Disputa D
where D.azul = C.nome)
or not exists (select *
from Disputa D
where D.verde = C.nome)
A execução do comando acima produziria somente a lista completa dos competidores que:
Aparticiparam em disputas com camisas das duas cores;
Bnunca participaram em disputas com camisa verde;
Cnunca participaram em disputas com camisa azul;
Dnas disputas em que participaram, usaram sempre camisas da mesma cor;
Enunca participaram em disputas.
Revelar gabarito e comentário▾
GabaritoD — nas disputas em que participaram, usaram sempre camisas da mesma cor;
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 com NOT EXISTS e OR
Gabarito: letra D. O comando seleciona os competidores para os quais não existe disputa como azul ou para os quais não existe disputa como verde — ou seja, aqueles que nunca usaram uma das duas cores. Isso equivale a dizer que, nas disputas em que participaram, usaram sempre a mesma cor (ou nunca participaram). A lógica do NOT EXISTS com OR é o coração da questão.
O comando usa duas subconsultas correlacionadas: cada uma verifica, para cada competidor C, se existe uma disputa em que ele aparece na coluna azul ou na coluna verde. O NOT EXISTS retorna verdadeiro quando a subconsulta não encontra nenhuma linha. Como as duas condições estão ligadas por OR, basta que uma delas seja verdadeira para o competidor ser incluído no resultado.
Vamos analisar os dados:
Competidor A: aparece como azul em (A,B), (C,A), (B,A), (F,A) e como verde em (C,A). Participou das duas cores → não é selecionado.
Competidor B: aparece como azul em (B,A) e como verde em (A,B). Participou das duas cores → não é selecionado.
Competidor C: aparece como azul em (C,A), (C,E) e como verde em (A,B)? Não, verde em (A,B) é B. Verde em (C,A) é A. Verde em (B,A) é A. Verde em (C,E) é E. Verde em (F,A) é A. Verde em (F,D) é D. Então C aparece como azul em (C,A) e (C,E), e nunca como verde → NOT EXISTS para verde é verdadeiro → selecionado.
Competidor D: aparece como azul em (F,D) e como verde em (F,D)? Não, verde em (F,D) é D. Então D aparece como verde em (F,D) e nunca como azul → NOT EXISTS para azul é verdadeiro → selecionado.
Competidor E: aparece como azul em (C,E) e como verde em (C,E)? Não, verde em (C,E) é E. Então E aparece como verde em (C,E) e nunca como azul → NOT EXISTS para azul é verdadeiro → selecionado.
Competidor F: aparece como azul em (F,A), (F,D) e como verde em (A,B)? Não, verde em (A,B) é B. Verde em (C,A) é A. Verde em (B,A) é A. Verde em (C,E) é E. Verde em (F,A) é A. Verde em (F,D) é D. Então F aparece como azul em (F,A) e (F,D), e nunca como verde → NOT EXISTS para verde é verdadeiro → selecionado.
Portanto, o resultado é: C, D, E, F. Esses são exatamente os competidores que nunca usaram uma das duas cores — ou seja, nas disputas em que participaram, usaram sempre a mesma cor (ou nunca participaram, como seria o caso de um competidor que não aparece em nenhuma disputa).
A pegadinha está em interpretar o OR como AND. Se fosse AND, selecionaríamos apenas os que nunca participaram de nenhuma disputa (nenhum, pois todos aparecem em pelo menos uma). Mas com OR, basta não ter participado de uma das cores.
NÃO CAIA NESSA!
A banca troca o OR por AND mentalmente. Com AND, o resultado seria vazio (ninguém nunca participou de nenhuma disputa). Com OR, selecionamos quem nunca usou uma das cores. Guarde: NOT EXISTS (azul) OR NOT EXISTS (verde) = quem não tem azul OU não tem verde.
NOT EXISTS (azul) OR NOT EXISTS (verde)
1Lógica: seleciona quem não tem azul OU não tem verde
2Resultado: nunca usou uma das duas cores
Participou sempre da mesma cor
Ou nunca participou
3Pegadinha: trocar OR por AND
AND = nunca participou de nenhuma (vazio)
OR = nunca usou uma cor (C, D, E, F)
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Afirma que o comando retorna os competidores que participaram de disputas com as duas cores. Isso seria o oposto: quem participou das duas cores tem EXISTS para azul E EXISTS para verde, então NOT EXISTS para ambas seria falso. A alternativa inverte a lógica.
Alternativa B — ❌ Incorreta
Afirma que retorna os que nunca participaram com camisa verde. Isso seria apenas a primeira condição (NOT EXISTS para verde), mas o comando também inclui quem nunca participou com camisa azul. A alternativa é parcial, não completa.
Alternativa C — ❌ Incorreta
Afirma que retorna os que nunca participaram com camisa azul. Isso seria apenas a segunda condição (NOT EXISTS para azul), mas o comando também inclui quem nunca participou com camisa verde. A alternativa é parcial, não completa.
Alternativa D — ✅ Correta ⟵ GABARITO
O comando retorna os competidores que nunca usaram uma das duas cores. Isso significa que, nas disputas em que participaram, usaram sempre a mesma cor (ou nunca participaram). É exatamente o que a alternativa descreve.
Alternativa E — ❌ Incorreta
Afirma que retorna os que nunca participaram de disputas. Isso seria verdadeiro apenas se o competidor não aparecesse nem como azul nem como verde. Mas o comando também inclui quem participou de uma cor apenas. A alternativa é restrita demais.