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.
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.
Considere a instância da tabela fibo, anteriormente apresentada, depois de um conjunto de alterações errôneas.Considere ainda o comando SQL a seguir.Assinale o número de linhas removidas da tabela fibo pela execução do comando acima com a presente instância.
A0.
B2.
C4.
D6.
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.
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.
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.
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.
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.