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
fg161119
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)

 

Considere a instância da tabela fibo, anteriormente apresentada, depois de um conjunto de alterações errôneas.

 
PN
10
21
31
42
54
65
78
813
921
1034
 

Considere ainda o comando SQL a seguir.

 

delete from fibo

where fibo.P > 2

and ( exists

(select * from fibo f

    where f.P > fibo.P and f.N < fibo.N )

or

exists

(select * from fibo f

    where f.P < fibo.P and f.N > fibo.N )

or

not exists

(select * from fibo f1, fibo f2

where fibo.P - 2 = f1.P

and fibo.P - 1 = f2.P

and fibo.N = f1.N + f2.N )

)

 

Assinale 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

Em SQL, um comando DELETE remove linhas de uma tabela que satisfazem a condição do WHERE. Quando o WHERE contém subconsultas correlacionadas, cada linha é testada individualmente: a subconsulta é executada para cada linha, usando valores da linha atual. Isso permite comparar cada linha com as demais da tabela.

A condição do WHERE é uma combinação de três condições unidas por OR. A primeira verifica se existe uma linha com P maior e N menor (pico). A segunda verifica se existe uma linha com P menor e N maior (vale). A terceira verifica se a linha não segue a regra de Fibonacci (N = soma dos dois anteriores). Se qualquer uma for verdadeira, a linha é removida.

Esta questão cobra a análise de um comando DELETE com subconsultas correlacionadas. Precisamos avaliar cada linha da instância fornecida contra as três condições para determinar quais são removidas.

O que a questão dá

  • instância da tabela fibo: P=1,N=0; P=2,N=1; P=3,N=1; P=4,N=2; P=5,N=4; P=6,N=5; P=7,N=8; P=8,N=13; P=9,N=21; P=10,N=34

O que queremos: o número de linhas removidas pelo comando DELETE

Passo 1 — Verificar a condição de pico para cada linha

A primeira condição do WHERE remove linhas que são 'picos': existe uma linha posterior com N menor. Precisamos testar isso para cada linha, pois é uma das três formas de a linha ser removida.

Nenhuma linha é pico

NÃO CAIA NESSA!

Confundir a direção da comparação: a condição exige f.P > fibo.P e f.N < fibo.N, ou seja, uma linha com posição maior e valor menor.

Passo 2 — Verificar a condição de vale para cada linha

A segunda condição remove linhas que são 'vales': existe uma linha anterior com N maior. Precisamos testar isso, pois é outra forma de remoção.

LinhasP=5,6,7,8,9,10 sa~ovalesLinhas P = \boxed{5{,}6{,}7{,}8{,}9{,}10\ \text{s}ã\text{o} \text{vales}}
NÃO CAIA NESSA!

Achar que a condição de vale é sobre N menor, mas é sobre N maior: f.P < fibo.P e f.N > fibo.N.

Passo 3 — Verificar a regra de Fibonacci para cada linha

A terceira condição remove linhas que não seguem a sequência de Fibonacci: N não é a soma dos dois termos anteriores. Precisamos testar isso, pois é a última forma de remoção.

LinhasP=5,6,7,8,9,10 na~oseguemaregraLinhas P = \boxed{5{,}6{,}7{,}8{,}9{,}10\ \text{n}ã\text{o} \text{seguem} \text{a} \text{regra}}
NÃO CAIA NESSA!

Esquecer que a condição usa NOT EXISTS: a linha é removida se NÃO existir par de linhas anteriores que somem N.

Passo 4 — Combinar as condições e contar as remoções

Como as condições são unidas por OR, basta uma ser verdadeira para a linha ser removida. Já identificamos quais linhas satisfazem cada condição; agora unimos os conjuntos e contamos.

6 linhas removidas

NÃO CAIA NESSA!

Contar duas vezes linhas que satisfazem mais de uma condição; aqui, as linhas P=5 a P=10 satisfazem a condição de vale e a de Fibonacci, mas contam uma única vez.

Resposta: 6 linhas — alternativa D

Link permanente: /questoes/fg161119