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

from competidor c, disputa d

where (c.nome = d.azul and c.nome = d.verde)

   or (c.nome = d.verde and c.nome = d.azul)

 

O número de linhas produzidas pela execução desse comando, sem contar a linha de títulos, é:

  1. A0;
  2. B1;
  3. C6;
  4. D18;
  5. E36.
Revelar gabarito e comentário

GabaritoA — 0;

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

Produto Cartesiano e Condição de Igualdade em SQL

Gabarito: letra A (0 linhas). A consulta faz o produto cartesiano entre as tabelas Competidor (6 linhas) e Disputa (6 linhas), gerando 36 combinações, mas a condição do WHERE exige que o nome do competidor seja simultaneamente igual ao valor da coluna azul e ao valor da coluna verde da mesma linha de Disputa — o que é logicamente impossível, pois um competidor não pode ter dois nomes diferentes ao mesmo tempo. Portanto, nenhuma linha do produto cartesiano satisfaz a condição, resultando em 0 linhas.

O comando SQL apresentado é um exemplo clássico de produto cartesiano (também chamado de cross join), que ocorre quando listamos duas ou mais tabelas na cláusula FROM sem especificar uma condição de junção (JOIN). Nesse caso, cada linha da primeira tabela é combinada com todas as linhas da segunda tabela. Com 6 competidores e 6 disputas, temos 6 × 6 = 36 combinações possíveis. A cláusula WHERE então filtra essas 36 combinações, mantendo apenas aquelas que atendem à condição especificada.

A condição do WHERE é:

where (c.nome = d.azul and c.nome = d.verde)
   or (c.nome = d.verde and c.nome = d.azul)

Observe que as duas partes da condição são logicamente idênticas — a primeira exige que c.nome seja igual a d.azul E também igual a d.verde; a segunda apenas inverte a ordem das comparações, mas continua exigindo que c.nome seja igual a ambos os valores. Portanto, a condição inteira se resume a: c.nome = d.azul AND c.nome = d.verde.

Para que essa condição seja verdadeira, seria necessário que o valor da coluna azul fosse igual ao valor da coluna verde na mesma linha da tabela Disputa, e que ambos fossem iguais ao nome do competidor. Analisando os dados da tabela Disputa:

Azul

Verde

A

B

C

A

B

A

C

E

F

A

F

D

Em nenhuma linha os valores de azul e verde são iguais. Logo, a condição c.nome = d.azul AND c.nome = d.verde nunca é satisfeita, pois exigiria que um mesmo nome fosse igual a dois valores diferentes. Consequentemente, o WHERE filtra todas as 36 combinações do produto cartesiano, e o resultado final é um conjunto vazio, com 0 linhas.

A pegadinha desta questão está em não perceber que a condição é uma contradição lógica — ela pede que um único valor (c.nome) seja igual a dois valores diferentes (d.azul e d.verde) ao mesmo tempo. Muitos candidatos podem se confundir e pensar que a condição verifica se o competidor participou de alguma disputa (como azul ou como verde), mas a presença do AND (e não do OR) entre as comparações torna a condição impossível de ser satisfeita.

NÃO CAIA NESSA!

A banca troca o operador lógico esperado. Se a intenção fosse listar competidores que participaram de disputas, a condição correta seria c.nome = d.azul OR c.nome = d.verde. Ao usar AND, a condição exige que o mesmo nome seja igual a dois valores diferentes simultaneamente — o que é logicamente impossível. Fique atento: AND exige que todas as condições sejam verdadeiras; OR exige que pelo menos uma seja verdadeira.

Alternativa A — ✅ Correta ⟵ GABARITO

O produto cartesiano entre Competidor (6 linhas) e Disputa (6 linhas) gera 36 combinações. A condição do WHERE exige que c.nome seja igual a d.azul e igual a d.verde na mesma linha. Como em nenhuma linha da tabela Disputa os valores de azul e verde são iguais, nenhuma das 36 combinações satisfaz a condição. Portanto, o resultado é um conjunto vazio, com 0 linhas.

Alternativa B — ❌ Incorreta

A alternativa sugere que 1 linha seria retornada. Isso ocorreria se houvesse uma linha em Disputa onde azul = verde, o que não acontece. Nenhuma linha da tabela Disputa tem valores iguais nas colunas azul e verde, então não há como a condição ser satisfeita.

Alternativa C — ❌ Incorreta

A alternativa sugere 6 linhas, o que corresponderia ao número de competidores ou ao número de disputas. No entanto, a condição do WHERE não é uma simples verificação de participação — ela exige uma igualdade dupla impossível. Portanto, o resultado não é 6.

Alternativa D — ❌ Incorreta

A alternativa sugere 18 linhas, que é a metade do produto cartesiano (36/2). Esse número não tem relação com a lógica da condição. A condição é uma contradição, então o resultado é 0, não 18.

Alternativa E — ❌ Incorreta

A alternativa sugere 36 linhas, que é o total do produto cartesiano sem nenhum filtro. No entanto, a cláusula WHERE filtra todas as combinações, pois a condição é logicamente impossível de ser satisfeita. Portanto, o resultado não é 36.

Gabarito: letra A — a execução do comando produz 0 linhas, pois a condição do WHERE é uma contradição lógica (exige que um nome seja igual a dois valores diferentes ao mesmo tempo).

Link permanente: /questoes/fg165199