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

AzulVerde
AB
CA
BA
CE
FA
FD
 

Considerando as tabelas Competidor e Disputa, descritas anteriormente, analise o comando SQL abaixo.

 

select c1.nome, c2.nome

from Competidor c1, Competidor c2

where not exists

               (select * from Disputa d

                where d.azul = c2.nome

                    and d.verde = c1.nome)

order by 1,2

 

Excetuados os títulos, o número de linhas produzidas pela execução desse comando é:

  1. A0;
  2. B6;
  3. C12;
  4. D30;
  5. E36.
Revelar gabarito e comentário

GabaritoD — 30;

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: Subconsulta correlacionada com NOT EXISTS

Gabarito: letra D (30 linhas). O comando faz um produto cartesiano entre as duas instâncias de Competidor (6 × 6 = 36 pares) e, para cada par (c1, c2), a subconsulta correlacionada verifica se existe uma disputa em que c2 usou camisa azul e c1 usou camisa verde. O NOT EXISTS mantém apenas os pares para os quais essa disputa não existe. Como há 6 disputas registradas, cada uma elimina exatamente 1 par, sobrando 36 − 6 = 30 linhas.

O comando é um exemplo clássico de subconsulta correlacionada: a subconsulta interna referencia colunas da consulta externa (d.azul = c2.nome e d.verde = c1.nome), sendo reavaliada para cada linha do produto cartesiano. O NOT EXISTS é um predicado de existência que retorna verdadeiro quando a subconsulta não retorna nenhuma linha. A lógica é: para cada par ordenado (c1, c2), pergunte "existe uma disputa onde c2 foi azul e c1 foi verde?". Se a resposta for não, o par entra no resultado.

Vamos verificar com os dados. A tabela Disputa tem 6 registros:

Azul

Verde

A

B

C

A

B

A

C

E

F

A

F

D

Cada disputa (azul=X, verde=Y) faz com que o par (c1=Y, c2=X) seja excluído do resultado, pois para esse par a subconsulta encontra uma linha. Por exemplo, a disputa (A, B) elimina o par (c1=B, c2=A). Como são 6 disputas e cada uma elimina exatamente um par distinto (não há disputas repetidas com a mesma combinação azul-verde), o total de pares eliminados é 6. Portanto, o resultado tem 36 − 6 = 30 linhas.

A pegadinha da banca está em inverter a ordem das colunas na subconsulta. Se a condição fosse d.azul = c1.nome and d.verde = c2.nome, estaríamos procurando disputas onde c1 foi azul e c2 foi verde — o que mudaria completamente o resultado. Aqui, a ordem é d.azul = c2.nome (c2 é o azul) e d.verde = c1.nome (c1 é o verde). É fundamental ler a subconsulta com atenção para não inverter os papéis.

Outra forma de pensar: o comando retorna todos os pares ordenados de competidores, exceto aqueles que correspondem a uma disputa real (com a orientação correta azul→verde). Como cada disputa tem uma orientação única, cada uma remove um único par do produto cartesiano.

NÃO CAIA NESSA!

A banca inverte a ordem das colunas na subconsulta para confundir. Repare que a condição é d.azul = c2.nome e d.verde = c1.nome — ou seja, c2 é o competidor de camisa azul e c1 é o de camisa verde. Se você inverter mentalmente (pensando que c1 é azul e c2 é verde), vai eliminar os pares errados e chegar a um resultado diferente. A dica é: sempre escreva ao lado do comando "c2 = azul, c1 = verde" antes de analisar.

Alternativa A — ❌ Incorreta

Afirma que o comando retorna 0 linhas. Isso só ocorreria se todas as 36 combinações possíveis de pares (c1, c2) correspondessem a uma disputa registrada, o que não é o caso — há apenas 6 disputas, então 30 pares não têm disputa correspondente.

Alternativa B — ❌ Incorreta

Afirma que o comando retorna 6 linhas. Esse número corresponde ao total de disputas registradas, não ao resultado da consulta. O candidato pode confundir o número de disputas com o número de pares que não têm disputa, mas o raciocínio correto é subtrair as 6 disputas do total de 36 pares.

Alternativa C — ❌ Incorreta

Afirma que o comando retorna 12 linhas. Esse número não tem relação direta com os dados. Pode ser uma tentativa de calcular 6 × 2 (disputas × 2 competidores), mas o produto cartesiano é entre as duas instâncias de Competidor, não entre Competidor e Disputa.

Alternativa D — ✅ Correta ⟵ GABARITO

O produto cartesiano entre Competidor c1 e Competidor c2 gera 6 × 6 = 36 pares ordenados. Cada uma das 6 disputas elimina exatamente 1 par (aquele em que c2 é o azul e c1 é o verde). Portanto, o resultado tem 36 − 6 = 30 linhas. O NOT EXISTS garante que apenas os pares sem disputa correspondente sejam retornados.

Alternativa E — ❌ Incorreta

Afirma que o comando retorna 36 linhas. Esse seria o resultado se o NOT EXISTS não eliminasse nenhum par, ou seja, se não houvesse nenhuma disputa registrada. Como há 6 disputas, 6 pares são eliminados, restando 30.

Gabarito: letra D

Link permanente: /questoes/fg165219