Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2023

Banco de DadosConsultas e Comandos em SQL
Código
fg161118
Banca
FGV
Órgão
CAM DEP
Ano
2023
Cargo
AL ( )

Quando mencionada, considere a tabela relacional intitulada fibo, com duas colunas, cuja instância, não necessariamente nessa ordem, é exibida a seguir.

 

Tabela fibo

PN
10
21
31
42
53
65
78
813
921
1034
 

A coluna da esquerda enumera as linhas, continuamente, e a coluna da direita armazena os dez primeiros elementos da sequência de Fibonacci, na qual os dois primeiros termos são 0 e 1, por definição, e cada termo subsequente é a soma dos dois termos anteriores.

 

----------------------------------------------------------------

 

Suponha que a tabela fibo, apresentada anteriormente, tenha sido danificada, e sua instância corrente seja a que segue.

 
PN
10
21
31
65
78
 

Para restaurar a tabela, foi produzido o comando SQL a seguir.

 

insert into fibo

select f2.P + 1, f1.N + f2.N

from fibo f1, fibo f2

where f1.P = f2.P - 1

and f2.P < 10

and not exists

(select * from fibo f3

where f1.N + f2.N = f3.N and f3.P > f2.P)

 

A instância da tabela fibo, anteriormente apresentada, foi danificada na primeira coluna em algumas linhas, com exceção das duas primeiras linhas, como mostrado a seguir.

 
PN
10
21
01
52
43
65
38
013
821
1034
 

Para a restauração da instância da tabela fibo a partir desse estado, foram preparados três comandos SQL.

 

I.update fibo

set fibo.P = (select sum(1) from fibo f1

where f1.N <= fibo.N)

where fibo.P > 2

 

II.update fibo

set fibo.P = (select sum(1) from fibo f1

where f1.N <= fibo.N

group by f1.N)

where fibo.P > 2

 

III.update fibo

set fibo.P = select sum(1) from fibo f1

where f1.N < fibo.N

and fibo.P > 2

 

Com relação ao emprego desses comandos, assinale a afirmativa correta.

  1. ANenhum é adequado.
  2. BSomente I e II são adequados.
  3. CSomente I e III são adequados.
  4. DSomente II e III são adequados.
  5. ETodos são adequados.
Revelar gabarito e comentário

GabaritoA — Nenhum é adequado.

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: UPDATE com subconsulta correlacionada e restauração de dados

Gabarito: letra A — nenhum dos três comandos é adequado para restaurar a tabela fibo a partir do estado danificado. O comando I e o comando II, embora tenham sintaxe válida, não produzem a sequência correta de valores de P; o comando III é inválido por erro de sintaxe (falta de parênteses na subconsulta).

A questão exige analisar três comandos UPDATE que tentam reconstruir a coluna P da tabela fibo, que foi danificada. A tabela original tem 10 linhas, com P variando de 1 a 10 e N seguindo a sequência de Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34. Após o dano, as linhas com P > 2 tiveram seus valores de P corrompidos (alguns viraram 0, outros ficaram trocados), mas os valores de N permaneceram intactos. O objetivo dos comandos é reatribuir a P os valores corretos (3, 4, 5, 6, 7, 8, 9, 10) com base nos valores de N.

A lógica por trás dos comandos I e II é usar uma subconsulta correlacionada que conta quantas linhas têm valor de N menor ou igual ao N da linha atual. Como a sequência de Fibonacci é estritamente crescente (exceto os dois primeiros termos iguais a 1), essa contagem deveria retornar a posição correta. Por exemplo, para N = 2, existem 3 linhas com N <= 2 (0, 1, 1), então P deveria ser 4. Mas há um problema: a subconsulta conta também as linhas com P danificado (inclusive as que têm P = 0), e como a tabela está sendo atualizada linha a linha, o resultado pode ser afetado pela ordem de atualização. Além disso, a subconsulta não exclui a linha atual, o que pode causar contagem incorreta.

O comando III é claramente inválido: a subconsulta select sum(1) from fibo f1 where f1.N < fibo.N and fibo.P > 2 não está entre parênteses, o que é obrigatório em SQL para subconsultas no SET. Sem os parênteses, o comando não é executável.

Portanto, nenhum dos comandos é adequado para restaurar a tabela corretamente. A alternativa correta é a letra A.

Alternativa A — ✅ Correta ⟵ GABARITO

A alternativa A afirma que nenhum dos comandos é adequado. Isso está correto porque:

  • Comando I: embora tenha sintaxe válida, a subconsulta select sum(1) from fibo f1 where f1.N <= fibo.N conta todas as linhas com N menor ou igual ao N da linha atual, incluindo a própria linha e as linhas com P danificado. Como a tabela é atualizada linha a linha, o valor de P pode ser calculado incorretamente, especialmente porque a subconsulta não exclui a linha atual. Além disso, a contagem inclui linhas com P danificado, o que pode gerar valores incorretos.

  • Comando II: semelhante ao I, mas com group by f1.N. A subconsulta select sum(1) from fibo f1 where f1.N <= fibo.N group by f1.N retorna uma linha para cada valor distinto de N, e o sum(1) conta quantas linhas têm aquele N. No entanto, o group by não altera o resultado da contagem, pois cada grupo tem apenas uma linha (já que N é único na sequência de Fibonacci). Portanto, o comando II também não produz a sequência correta, pois a contagem inclui a própria linha e as linhas com P danificado.

  • Comando III: inválido por erro de sintaxe. A subconsulta select sum(1) from fibo f1 where f1.N < fibo.N and fibo.P > 2 não está entre parênteses, o que é obrigatório em SQL para subconsultas no SET. Sem os parênteses, o comando não é executável.

Portanto, a alternativa A está correta.

Alternativa B — ❌ Incorreta

A alternativa B afirma que somente I e II são adequados. Isso está incorreto porque, como explicado, os comandos I e II não produzem a sequência correta de valores de P. A subconsulta correlacionada conta todas as linhas com N menor ou igual ao N da linha atual, incluindo a própria linha e as linhas com P danificado. Isso pode gerar valores incorretos, especialmente porque a tabela é atualizada linha a linha, e a ordem de atualização pode afetar o resultado. Portanto, I e II não são adequados.

Alternativa C — ❌ Incorreta

A alternativa C afirma que somente I e III são adequados. Isso está incorreto porque o comando III é inválido por erro de sintaxe (falta de parênteses na subconsulta), e o comando I não produz a sequência correta de valores de P. Portanto, nem I nem III são adequados.

Alternativa D — ❌ Incorreta

A alternativa D afirma que somente II e III são adequados. Isso está incorreto porque o comando III é inválido por erro de sintaxe, e o comando II não produz a sequência correta de valores de P. Portanto, nem II nem III são adequados.

Alternativa E — ❌ Incorreta

A alternativa E afirma que todos são adequados. Isso está incorreto porque o comando III é inválido por erro de sintaxe, e os comandos I e II não produzem a sequência correta de valores de P. Portanto, nenhum dos comandos é adequado.

NÃO CAIA NESSA!

A banca tenta fazer o candidato acreditar que os comandos I e II são adequados porque têm sintaxe válida e a lógica parece correta. No entanto, a subconsulta correlacionada conta todas as linhas com N menor ou igual ao N da linha atual, incluindo a própria linha e as linhas com P danificado. Isso pode gerar valores incorretos, especialmente porque a tabela é atualizada linha a linha. Além disso, o comando III é claramente inválido por erro de sintaxe. Portanto, nenhum dos comandos é adequado.

PEGA ESSA DICA!

Para resolver questões de restauração de dados com UPDATE e subconsultas correlacionadas, verifique se a subconsulta exclui a linha atual e se a ordem de atualização pode afetar o resultado. Além disso, sempre confira a sintaxe: subconsultas no SET devem estar entre parênteses.

Gabarito: letra A

Link permanente: /questoes/fg161118