Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg061607
Banca
FGV
Órgão
Câmara dos Deputados
Ano
2023
Nível
Superior
Cargo
Analista Legislativo - Informática Legislativa - Tarde
Atenção: o enunciado a seguir refere-se a próxima questão.

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

Imagem da questão

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.

Imagem da questão

Imagem da questão
Considere a instância da tabela fibo, anteriormente apresentada, depois de um conjunto de alterações errôneas.Imagem associada para resolução da questãoConsidere ainda o comando SQL a seguir.Imagem associada para resolução da questãoAssinale o número de linhas removidas da tabela fibo pela execução do comando acima com a presente instância.
  1. A0.
  2. B2.
  3. C4.
  4. D6.
  5. E8.
Revelar gabarito e comentário

GabaritoD — 6.

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

Resolução

Gabarito: letra D — a conta chega a 6 linhas — alternativa D.

A ideia por trás

Um comando DELETE remove linhas de uma tabela conforme uma condição. Quando a condição usa uma subconsulta que se refere à própria linha que está sendo avaliada (aqui, comparando f2.n com fibo.n), chamamos de subconsulta correlacionada: ela é recalculada para cada linha, como se fosse um laço que percorre a tabela linha por linha.

A subconsulta conta quantas linhas f2 têm valor n menor que o n da linha atual. O resultado dessa contagem é comparado com 3. Se a contagem for maior ou igual a 3, a linha é removida. Isso significa que a linha com o menor n (0) tem 0 linhas menores, a segunda (1) tem 1, a terceira (1) tem 2 — nenhuma é removida. A partir da quarta linha (2), que tem 3 linhas menores, todas são removidas até a última (34).

Esta questão cobra exatamente a interpretação da subconsulta correlacionada: é preciso, para cada linha, contar quantas linhas têm valor menor e aplicar o filtro >= 3. O número de linhas que satisfazem essa condição é a resposta.

O que a questão dá

  • tabela fibo com 10 linhas: valores 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

  • comando DELETE com subconsulta correlacionada: DELETE FROM fibo WHERE (SELECT COUNT(*) FROM fibo f2 WHERE f2.n < fibo.n) >= 3

O que queremos: o número de linhas removidas da tabela fibo

Passo 1 — Listar os valores da tabela em ordem

Para saber quantas linhas têm valor menor que cada uma, precisamos ver os valores ordenados. A tabela tem 10 linhas com os valores da sequência de Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

0 ,1,1,2,3,5,8,13,21,34\boxed{0\ , 1, 1, 2, 3, 5, 8, 13, 21, 34}
NÃO CAIA NESSA!

Esquecer que o valor 1 aparece duas vezes; isso afeta a contagem de linhas menores para os valores seguintes.

Passo 2 — Contar quantas linhas são menores que cada valor

A subconsulta correlacionada faz exatamente essa contagem para cada linha. Precisamos reproduzir esse cálculo manualmente para saber quais linhas passam no filtro.

Por que esta fórmula: A contagem é o número de linhas f2 com f2.n < fibo.n. Para o valor 0, nenhuma linha é menor; para o primeiro 1, apenas o 0 é menor (1 linha); para o segundo 1, também apenas o 0 (1 linha); para o 2, são 0, 1, 1 (3 linhas); e assim por diante.

0 → 0; 1 → 1; 1 → 1; 2 → 3; 3 → 4; 5 → 5; 8 → 6; 13 → 7; 21 → 8; 34 → 9

NÃO CAIA NESSA!

Contar o próprio valor como menor que ele mesmo — a comparação é estritamente menor, então o próprio valor não entra.

Passo 3 — Aplicar o filtro de contagem maior ou igual a 3

A condição do DELETE remove apenas as linhas cuja contagem seja >= 3. Com as contagens calculadas, basta marcar quais valores atendem.

Por que esta fórmula: O operador >= inclui o 3, então a linha com contagem exatamente 3 (o valor 2) também é removida. Se fosse >, o 2 ficaria de fora.

valores removidos: 2, 3, 5, 8, 13, 21, 34

NÃO CAIA NESSA!

Usar > em vez de >= e deixar o valor 2 de fora — isso daria 5 linhas, não 6.

Passo 4 — Contar as linhas removidas

O número de linhas que passaram no filtro é exatamente o número de linhas que o DELETE remove. Basta contar os valores marcados no passo anterior.

6 linhas\boxed{6\ \text{linhas}}
NÃO CAIA NESSA!

Contar também as três primeiras linhas (0, 1, 1) — elas não passam no filtro porque têm menos de 3 linhas menores.

Resposta: 6 linhas — alternativa D

Link permanente: /questoes/fg061607