Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg063596
Banca
FGV
Órgão
DPE-RS
Ano
2023
Nível
Superior
Cargo
Analista - Área de Apoio Especializado - Tecnologia da Informação - Banco de Dados

Tabela R1


Na questão a seguir, considere a tabela R1, cuja instância é exibida a seguir. 

Imagem da questão

Com referência à tabela R1 descrita anteriormente, analise o comando SQL a seguir.select * from R1 x, R1 ywhere x.A > y.A and x.B = y.BO número de linhas produzidas pela execução desse comando, sem contar a linha de títulos, é:
  1. A0;
  2. B1;
  3. C2;
  4. D3;
  5. E4.
Revelar gabarito e comentário

GabaritoB — 1;

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 com autojunção e condição de junção

Gabarito: letra B. O comando select * from R1 x, R1 y where x.A > y.A and x.B = y.B executa um produto cartesiano da tabela R1 consigo mesma (autojunção) e, em seguida, filtra as combinações em que o valor de A da primeira ocorrência é maior que o de A da segunda, e os valores de B são iguais. Analisando a instância da tabela, apenas um par de linhas satisfaz essas condições, resultando em 1 linha no resultado.

O comando SQL apresentado é uma autojunção (self-join) explícita, escrita na sintaxe antiga de junção, onde as tabelas são listadas na cláusula FROM separadas por vírgula e a condição de junção é colocada na cláusula WHERE. Essa sintaxe equivale a um INNER JOIN com a condição especificada. O produto cartesiano entre a tabela R1 e ela mesma gera todas as combinações possíveis de pares de linhas (x, y). Se a tabela R1 tem n linhas, o produto cartesiano terá n² combinações. No entanto, a condição WHERE restringe esse resultado, mantendo apenas os pares que atendem aos critérios.

Para resolver a questão, é necessário conhecer a instância da tabela R1. A tabela R1 possui as colunas A e B, e seus valores são:

A

B

1

2

2

2

3

1

Vamos analisar o produto cartesiano e aplicar a condição. O produto cartesiano gera 3 × 3 = 9 pares (x, y). A condição x.A > y.A and x.B = y.B exige que, para cada par, o valor de A da linha x seja estritamente maior que o valor de A da linha y, e que os valores de B sejam iguais.

Vamos testar cada par:

  • (x=(1,2), y=(1,2)): x.A=1 > y.A=1? Não.

  • (x=(1,2), y=(2,2)): x.A=1 > y.A=2? Não.

  • (x=(1,2), y=(3,1)): x.A=1 > y.A=3? Não.

  • (x=(2,2), y=(1,2)): x.A=2 > y.A=1? Sim. x.B=2 = y.B=2? Sim. Atende.

  • (x=(2,2), y=(2,2)): x.A=2 > y.A=2? Não.

  • (x=(2,2), y=(3,1)): x.A=2 > y.A=3? Não.

  • (x=(3,1), y=(1,2)): x.A=3 > y.A=1? Sim. x.B=1 = y.B=2? Não.

  • (x=(3,1), y=(2,2)): x.A=3 > y.A=2? Sim. x.B=1 = y.B=2? Não.

  • (x=(3,1), y=(3,1)): x.A=3 > y.A=3? Não.

Apenas o par (x=(2,2), y=(1,2)) atende a todas as condições. Portanto, o resultado tem 1 linha.

A pegadinha dessa questão está em não considerar corretamente a condição de junção. Muitos candidatos podem contar apenas os pares em que x.A > y.A, esquecendo de verificar a igualdade de B, ou podem errar ao considerar a comparação como >= em vez de >. Além disso, é comum confundir a autojunção com uma junção entre tabelas diferentes, mas o raciocínio é o mesmo.

Alternativa A — ❌ Incorreta

Afirma que o resultado tem 0 linhas. Isso estaria correto se nenhum par atendesse à condição, mas o par (x=(2,2), y=(1,2)) atende, pois 2 > 1 e 2 = 2. Portanto, há pelo menos uma linha.

Alternativa B — ✅ Correta ⟵ GABARITO

Como demonstrado, apenas o par (x=(2,2), y=(1,2)) satisfaz x.A > y.A e x.B = y.B. Logo, o comando retorna exatamente 1 linha. A alternativa está correta.

Alternativa C — ❌ Incorreta

Afirma que o resultado tem 2 linhas. Isso ocorreria se houvesse dois pares distintos atendendo à condição. No entanto, apenas um par atende. O candidato pode ter contado também o par (x=(3,1), y=(1,2)) por engano, mas nesse par os valores de B são diferentes (1 ≠ 2), então ele é descartado.

Alternativa D — ❌ Incorreta

Afirma que o resultado tem 3 linhas. Isso seria o número de linhas da tabela original, mas não o número de linhas do resultado da consulta. O candidato pode ter confundido o número de linhas da tabela com o número de linhas do resultado.

Alternativa E — ❌ Incorreta

Afirma que o resultado tem 4 linhas. Não há fundamento para esse número. O produto cartesiano tem 9 combinações, mas a condição restringe a apenas 1. O candidato pode ter contado os pares em que x.A > y.A sem verificar a igualdade de B, o que daria 3 pares (x=(2,2), y=(1,2); x=(3,1), y=(1,2); x=(3,1), y=(2,2)), mas ainda assim não seriam 4.

Gabarito: letra B

Link permanente: /questoes/fg063596