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

AB
CA
BA
CE
FA
FD
 

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:

  1. Aparticiparam em disputas com camisas das duas cores;
  2. Bnunca participaram em disputas com camisa verde;
  3. Cnunca participaram em disputas com camisa azul;
  4. Dnas disputas em que participaram, usaram sempre camisas da mesma cor;
  5. 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.

Gabarito: letra D

Link permanente: /questoes/fg165201