Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2023

Banco de DadosSQL
Código
fg070557
Banca
FGV
Órgão
SMF-RJ
Ano
2023
Nível
Superior
Cargo
Fiscal de Rendas

Considere a existência de uma tabela relacional N, com apenas uma coluna, intitulada numero, contendo os números inteiros de 1 até 100, um em cada linha, como ilustrada a seguir.


Imagem da questão


Como pode haver discrepâncias entre implementações da linguagem SQL, é dado que a função sqrt(x) retorna a raiz quadrada de x e que a expressão a % b retorna o resto da divisão inteira de a por b.

Este é a resultado produzido por um determinado script SQL que utiliza a tabela N, anteriormente descrita.


Imagem associada para resolução da questão


Abaixo, são apresentadas três versões para o referido script, não necessariamente corretas.


Imagem associada para resolução da questão


Sobre essas afirmativas, é correto afirmar que:

  1. Anenhuma delas produz o resultado correto;
  2. Bsomente l e ll produzem o resultado correto;
  3. Csomente Il e Ill produzem o resultado correto;
  4. Dsomente III produz o resultado correto;
  5. Etodas produzem o resultado correto.
Revelar gabarito e comentário

GabaritoE — todas produzem o resultado correto.

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: produto cartesiano e filtro de desigualdade

Gabarito: letra E. As três versões do script produzem o mesmo resultado correto, pois todas realizam o produto cartesiano da tabela N com ela mesma e filtram as linhas em que os valores das duas colunas são diferentes, retornando 9.900 linhas. A chave está em reconhecer que n1.numero <> n2.numero exclui apenas os 100 pares em que os números são iguais, e que as três sintaxes são equivalentes para esse fim.

O problema central é entender o que acontece quando uma tabela é combinada consigo mesma em um JOIN sem condição de junção — o chamado produto cartesiano. A tabela N tem 100 linhas (números de 1 a 100). Ao fazer FROM N n1, N n2 (ou JOIN), o banco combina cada linha de n1 com cada linha de n2, gerando 100 × 100 = 10.000 combinações possíveis. Dessas, a condição WHERE n1.numero <> n2.numero (ou ON n1.numero <> n2.numero) mantém apenas os pares em que os números são diferentes. Para cada número de 1 a 100, existe exatamente um par em que ele aparece igual nos dois lados: (1,1), (2,2), ..., (100,100). São 100 pares eliminados. Portanto, o resultado tem 10.000 − 100 = 9.900 linhas.

Agora, o que muda entre as três versões? A primeira usa FROM N n1, N n2 WHERE n1.numero <> n2.numero — a sintaxe clássica de junção implícita com filtro no WHERE. A segunda usa FROM N n1 JOIN N n2 ON n1.numero <> n2.numero — a junção explícita com a condição no ON. A terceira usa FROM N n1 CROSS JOIN N n2 WHERE n1.numero <> n2.numero — o produto cartesiano explícito com filtro no WHERE. As três são maneiras equivalentes de expressar a mesma operação: combinar todas as linhas e depois selecionar aquelas em que os números diferem. Não há diferença semântica no resultado final, apenas na forma de escrever.

A pegadinha que a banca explora é justamente essa: o candidato pode achar que CROSS JOIN não aceita WHERE, ou que JOIN ... ON com desigualdade se comporta de forma diferente, ou que a sintaxe implícita com vírgula é obsoleta. Nenhuma dessas suposições é verdadeira. Todas as três produzem exatamente o mesmo conjunto de pares ordenados (a, b) com a ≠ b, totalizando 9.900 linhas. A ordem das linhas pode variar entre implementações, mas o conteúdo é idêntico.

Guarde o critério decisivo: o que importa é o conjunto de linhas retornado, não a sintaxe usada. Se todas as versões expressam o mesmo produto cartesiano com o mesmo filtro de desigualdade, o resultado é o mesmo. É exatamente nessa equivalência que as alternativas se dividem.

  1. 1100 × 100 = 10.000 pares
  2. 2Filtra n1.numero <> n2.numero
  3. 3Exclui 100 pares iguais
  4. 4Resultado: 9.900 linhas
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Afirma que nenhuma das versões produz o resultado correto. Isso é falso, pois todas as três produzem o mesmo resultado de 9.900 linhas, como demonstrado. A alternativa tenta induzir o candidato a achar que alguma sintaxe está errada, mas todas são válidas e equivalentes.

Alternativa B — ❌ Incorreta

Afirma que somente I e II produzem o resultado correto, excluindo a III. A versão III, que usa CROSS JOIN com WHERE, também produz o resultado correto. O CROSS JOIN é exatamente o produto cartesiano, e o filtro no WHERE funciona da mesma forma que nas outras versões. Portanto, a III também está correta.

Alternativa C — ❌ Incorreta

Afirma que somente II e III produzem o resultado correto, excluindo a I. A versão I, com a sintaxe implícita FROM N n1, N n2 WHERE ..., é a forma clássica e totalmente válida de fazer a junção. Ela produz o mesmo resultado que as outras. Portanto, a I também está correta.

Alternativa D — ❌ Incorreta

Afirma que somente III produz o resultado correto, excluindo I e II. Como já visto, tanto a sintaxe implícita (I) quanto a junção explícita com ON (II) produzem o mesmo resultado correto. A alternativa D é claramente falsa.

Alternativa E — ✅ Correta ⟵ GABARITO

Afirma que todas as versões produzem o resultado correto. De fato, as três sintaxes — junção implícita com WHERE, junção explícita com ON e CROSS JOIN com WHERE — são equivalentes e retornam as 9.900 linhas esperadas. A alternativa E é a única que reconhece essa equivalência.

PEGA ESSA DICA!

Na prova, quando vir três versões de um mesmo SELECT, compare o conjunto de linhas que cada uma retorna, não a sintaxe. Se a condição de filtro é a mesma e o produto cartesiano é o mesmo, o resultado é idêntico. Desconfie de alternativas que excluem uma versão sem motivo técnico — a banca adora criar distratores baseados em diferenças superficiais de escrita.

Gabarito: letra E

Link permanente: /questoes/fg070557