Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
fg165275
Banca
FGV
Órgão
Pref Nova Iguaçu
Ano
2024
Cargo
ATTM ( )

Seja um banco de dados relacional especificado em SQL de uma empresa de correspondência entre clientes, instituições financeiras e empréstimos contratados por esses clientes nessas instituições, previamente implementado em um banco de dados como a seguir:

 

Imagem associada para resolução da questão

 

OBS: Neste banco de dados, cadeias de caracteres (strings) são representadas envoltas em aspas simples.

 

Considere a seguinte sequência de comandos SQL:

 

insert into tb_cliente(id_cliente, num_cpf, nome)

values

 

(1,'111','cli1'),(2,'222','cli2'),(3,'333','cli3'),

(4,'444','cli4'),(5,'555','cli5');

 

update tb_cliente set estado='RJ'

where id_cliente%2!=0;

 

create view v_clientes_rj as

select id_cliente, num_cpf, nome, estado

from tb_cliente where estado = 'RJ';

 

Após a execução dos três comandos SQL apresentados, o seguinte comando foi executado:

 

insert into v_clientes_rj

values (6,'cli6','6666','MG');

 

Por fim, a seguinte consulta foi executada:

 

select count(*) from v_clientes_rj;

 

O retorno da última consulta executada será

  1. Ao valor 3, dado que a visão permanece selecionando tuplas de clientes do estado ‘RJ’.
  2. Bo valor 4, já que a execução do último comando de inserção alterou o estado da visão.
  3. Co valor 6, por esse ser o novo número de tuplas da tabela de base da visão.
  4. Dum erro, pois visões não aceitam inserções diretamente.
  5. Euma tabela vazia, pois a última inserção desconfigura a condição-alvo da visão.
Revelar gabarito e comentário

GabaritoA — o valor 3, dado que a visão permanece selecionando tuplas de clientes do estado ‘RJ’.

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

Visões (views) em SQL: tabelas virtuais e atualização de dados

Gabarito: letra A — o retorno da consulta é 3, pois a visão v_clientes_rj permanece selecionando apenas as tuplas com estado = 'RJ', e a inserção realizada através da visão não altera essa condição. A visão é uma tabela virtual derivada de uma consulta armazenada, e o comando INSERT executado sobre ela adiciona uma linha à tabela base, mas essa linha não satisfaz a condição da visão, portanto não aparece no resultado da consulta.

Uma visão (view) em SQL é um objeto que representa o resultado de uma consulta armazenada. Ela não armazena dados fisicamente — é uma tabela virtual que, quando consultada, executa a consulta definida na sua criação e retorna o resultado naquele momento. Isso significa que qualquer alteração nos dados das tabelas base é refletida na visão, pois a visão é recalculada a cada acesso. Por exemplo, se uma tabela base tem uma linha atualizada, a visão que a referencia mostrará o novo valor na próxima consulta.

A questão apresenta uma sequência de comandos: primeiro, insere cinco clientes na tabela tb_cliente; depois, atualiza o estado para 'RJ' nos clientes com id_cliente ímpar (1, 3 e 5); em seguida, cria a visão v_clientes_rj selecionando os clientes com estado = 'RJ'. Nesse momento, a visão contém três linhas (clientes 1, 3 e 5). Depois, executa um INSERT na visão com os valores (6, 'cli6', '6666', 'MG'). Esse comando insere uma nova linha na tabela base tb_cliente, mas como o estado é 'MG', essa linha não atende à condição WHERE estado = 'RJ' da visão. Portanto, a visão continua exibindo apenas as três linhas originais, e o COUNT(*) retorna 3.

A pegadinha central está em entender que a visão é uma consulta armazenada, não uma tabela física. Quando você insere através de uma visão, a linha é adicionada à tabela base, mas a visão só mostra as linhas que satisfazem sua condição. A linha com estado 'MG' fica invisível para a visão, mas existe na tabela base. Isso é diferente de uma visão materializada, que armazena fisicamente o resultado e pode ficar desatualizada.

NÃO CAIA NESSA!

A banca explora a confusão entre visão comum e visão materializada. Muitos candidatos pensam que a visão "guarda" o resultado e que a inserção alteraria a visão, mas na verdade a visão é recalculada a cada consulta. A linha inserida com estado 'MG' não aparece na visão, pois não atende à condição WHERE estado = 'RJ'. O COUNT(*) retorna 3, não 4 ou 6.

Comando

Efeito na tabela base tb_cliente

Efeito na visão v_clientes_rj

Resultado do COUNT(*) na visão

INSERT inicial (5 clientes)

5 linhas inseridas (ids 1–5)

Visão ainda não existe

UPDATE (estado='RJ' onde id ímpar)

Linhas 1, 3 e 5 com estado 'RJ'

Visão ainda não existe

CREATE VIEW

Sem alteração

Seleciona linhas com estado 'RJ' (ids 1, 3, 5)

3

INSERT na visão (id 6, estado 'MG')

Nova linha adicionada (id 6, estado 'MG')

Linha não atende à condição WHERE estado='RJ'; visão permanece com 3 linhas

3

  1. 1INSERT de 5 clientes
  2. 2UPDATE estado='RJ' (ids ímpares)
  3. 3CREATE VIEW v_clientes_rj
  4. 4INSERT via view (estado='MG')
  5. 5COUNT(*) → 3 (só RJ)
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

A visão v_clientes_rj foi criada com a condição WHERE estado = 'RJ'. Após o INSERT na visão, a linha (6, 'cli6', '6666', 'MG') é adicionada à tabela base tb_cliente, mas como o estado é 'MG', ela não satisfaz a condição da visão. Portanto, a visão continua exibindo apenas as três linhas com estado 'RJ' (clientes 1, 3 e 5). O COUNT(*) retorna 3. A visão permanece selecionando tuplas de clientes do estado 'RJ', exatamente como a alternativa afirma.

Alternativa B — ❌ Incorreta

Afirma que o retorno seria 4, pois a inserção alterou o estado da visão. Isso está errado: a inserção não altera a condição da visão, apenas adiciona uma linha à tabela base. A linha inserida tem estado 'MG', que não atende à condição WHERE estado = 'RJ', então ela não aparece na visão. O COUNT(*) continua 3, não 4.

Alternativa C — ❌ Incorreta

Afirma que o retorno seria 6, o novo número de tuplas da tabela base. Isso confunde a tabela base com a visão. A tabela base tb_cliente tem 6 linhas após a inserção, mas a visão v_clientes_rj só mostra as linhas com estado 'RJ', que são 3. O COUNT(*) na visão retorna 3, não 6.

Alternativa D — ❌ Incorreta

Afirma que ocorreria um erro, pois visões não aceitam inserções diretamente. Isso é falso: visões simples, baseadas em uma única tabela e sem agregações ou junções, são atualizáveis. A visão v_clientes_rj é uma visão simples, então o INSERT é permitido e adiciona a linha à tabela base. Não há erro.

Alternativa E — ❌ Incorreta

Afirma que o retorno seria uma tabela vazia, pois a última inserção desconfigura a condição-alvo da visão. Isso está errado: a inserção não altera a definição da visão. A visão continua com a condição WHERE estado = 'RJ', e as três linhas originais (clientes 1, 3 e 5) permanecem. O COUNT(*) retorna 3, não 0.

Gabarito: letra A

Link permanente: /questoes/fg165275