Pular para o conteúdo principal

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

Banco de DadosConsultas e Comandos em SQL
Código
qa537505
Banca
FUNDATEC
Órgão
BRDE
Ano
2023
Cargo
Ana Sist ( )

Considere a tabela PILOTOS e a visão PILOTOSA320 definidas pelos comandos SQL abaixo (padrão SQL99 ou superior).

 

create table PILOTOS

(codp int not null,

nomep varchar(200) not null,

salario float,

companhia varchar(200),

aviao char(5) not null default '777',

primary key(codp));

create view PILOTOSA320

as (select codp, nomep, companhia, aviao

    from PILOTOS

    where aviao = 'A320');

 

Considere os comandos SQL abaixo no mesmo padrão, em que cada comando corresponde a uma transação. Assinale com V, se o comando executa corretamente, ou com F, se o comando resulta em erro.

 

(   ) insert into PILOTOSA320(codp, nomep, companhia, aviao) values (1, 'jose', 'gol', 'A320');

 

(   ) insert into PILOTOSA320(codp, nomep, companhia, aviao) values (2, 'maria', 'tam', '777');

 

(   ) insert into PILOTOSA320(codp, nomep, aviao) values (2, 'jose', 'A320');

 

A ordem correta de preenchimento dos parênteses, de cima para baixo, é:

  1. AV – V – V.
  2. BV – F – V.
  3. CV – F – F.
  4. DF – V – V.
  5. EF – F – F.
Revelar gabarito e comentário

GabaritoA — V – V – V.

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 SQL: inserção através de visão simples

Gabarito: letra A (V – V – V). Os três comandos INSERT executam corretamente porque a visão PILOTOSA320 é uma visão simples (derivada de uma única tabela-base, sem agregação, sem DISTINCT, sem GROUP BY), o que a torna atualizável — e, no padrão SQL, inserções através de visões simples são permitidas, desde que respeitem as restrições da tabela-base (NOT NULL, DEFAULT, PK). A pegadinha está no segundo comando: inserir '777' na coluna aviao através da visão que filtra aviao = 'A320' não gera erro — a linha é inserida na tabela-base normalmente, apenas não aparecerá na visão.

O ponto central desta questão é entender quando uma visão é atualizável e o que acontece com as linhas inseridas que não satisfazem a condição da visão. Vamos por partes.

O que é uma visão (view)?

Uma visão é uma tabela virtual — uma consulta nomeada e armazenada no banco de dados. Ela não armazena dados fisicamente (no caso de visão não materializada); ao ser consultada, o banco executa a consulta que a define e devolve o resultado. No comando do enunciado:

create view PILOTOSA320
as (select codp, nomep, companhia, aviao
    from PILOTOS
    where aviao = 'A320');

Temos uma visão que seleciona apenas os pilotos cujo avião é 'A320'. Ela é uma visão simples: baseada em uma única tabela (PILOTOS), sem junções, sem agregações, sem DISTINCT, sem GROUP BY. Essa simplicidade é o que a torna atualizável — ou seja, permite executar INSERT, UPDATE e DELETE através dela.

Quando uma visão é atualizável?

No padrão SQL, uma visão é atualizável se:

  • É derivada de uma única tabela-base (sem junções);

  • Não usa DISTINCT, GROUP BY, HAVING, funções de agregação;

  • Não usa UNION, INTERSECT, EXCEPT;

  • Não usa subconsultas na cláusula WHERE que referenciem a própria visão;

  • Inclui todas as colunas NOT NULL sem valor padrão da tabela-base.

A visão PILOTOSA320 atende a todos esses requisitos: é baseada apenas em PILOTOS, não usa agregação nem DISTINCT, e inclui as colunas codp, nomep, companhia e aviao. Portanto, é atualizável.

O que acontece ao inserir através de uma visão?

Quando você insere através de uma visão atualizável, o banco traduz o INSERT para a tabela-base. A linha é inserida na tabela PILOTOS com os valores fornecidos. Se a linha não satisfizer a condição WHERE da visão (por exemplo, aviao = '777'), ela não aparecerá na visão, mas será inserida na tabela-base normalmente. Isso é um comportamento padrão do SQL — a visão não impõe a condição como restrição de integridade.

Análise dos comandos

Vamos analisar cada comando individualmente.

Comando 1 — ✅ V (Verdadeiro)

insert into PILOTOSA320(codp, nomep, companhia, aviao) values (1, 'jose', 'gol', 'A320');

Este comando insere uma linha com aviao = 'A320', que satisfaz a condição da visão. A linha será inserida na tabela PILOTOS e aparecerá na visão. Todos os atributos NOT NULL (codp, nomep, aviao) são fornecidos, e companhia é opcional (não tem NOT NULL). Portanto, o comando executa corretamente.

Comando 2 — ✅ V (Verdadeiro)

insert into PILOTOSA320(codp, nomep, companhia, aviao) values (2, 'maria', 'tam', '777');

Aqui está a pegadinha central da questão. O valor '777' não satisfaz a condição aviao = 'A320' da visão. Muitos candidatos marcam F, achando que isso gera erro. Mas não gera erro: a linha é inserida na tabela-base PILOTOS normalmente, apenas não aparecerá na visão. A visão não é uma tabela com restrição CHECK — é apenas uma consulta guardada. Portanto, o comando executa corretamente.

Comando

Executa?

Justificativa

INSERT ... (1, 'jose', 'gol', 'A320')

V

Linha satisfaz a condição da visão (aviao = 'A320'); todos os NOT NULL fornecidos.

INSERT ... (2, 'maria', 'tam', '777')

V

Visão simples é atualizável; linha é inserida na tabela-base, mesmo não aparecendo na visão (visão não impõe restrição).

INSERT ... (2, 'jose', 'A320')

V

Coluna companhia é opcional (aceita NULL); demais NOT NULL fornecidos.

Visão atualizável (simples)
  • 1Requisitos
    • Uma única tabela-base
    • Sem agregação/DISTINCT/GROUP BY
    • Sem UNION/INTERSECT/EXCEPT
  • 2Inserção via visão
    • Traduz para a tabela-base
    • Não impõe condição WHERE
    • Linha fora da condição
      • Inserida na base
      • Invisível na visão
LEVEL · soulevel.com.br
NÃO CAIA NESSA!

A banca explora exatamente a confusão entre visão e tabela com restrição. O candidato acha que inserir '777' através de uma visão que filtra 'A320' viola alguma regra — mas não viola. A visão não impõe a condição como CHECK; ela apenas define quais linhas aparecem. A linha é inserida na tabela-base e fica invisível na visão. Lembre-se: visão não é restrição de integridade.

Comando 3 — ✅ V (Verdadeiro)

insert into PILOTOSA320(codp, nomep, aviao) values (2, 'jose', 'A320');

Este comando omite a coluna companhia. Como companhia não tem NOT NULL nem DEFAULT, ela será preenchida com NULL. A coluna aviao é fornecida com 'A320', satisfazendo a condição da visão. As colunas codp e nomep são NOT NULL e foram fornecidas. Portanto, o comando executa corretamente.

Conclusão

Os três comandos executam corretamente. A ordem correta é V – V – V, correspondente à letra A.

Gabarito: letra A

Link permanente: /questoes/qa537505