No contexto de bancos de dados relacionais, visões são objetos essenciais que permitem criar consultas abstratas a partir de tabelas base. Eles oferecem benefícios como controle de acesso, simplificação de consultas e independência de dados, evitando repetição de operações de leitura.
Objetos Comuns em Bancos de Dados
| Objeto | Descrição |
|---|---|
| Tabela | Coleção primária de armazenamento de dados, estruturada em linhas e colunas |
| Visão | Conjunto lógico de dados derivado de tabelas subjacentes |
| Sequência | Gerador de valores numéricos sequenciais |
| Índice | Melhora o desempenho de consultas |
| Sinônimo | Fornece um nome alternativo para objetos do banco de dados |
Categorias de Visões
As visões podem ser classificadas com base em sua complexidade:
| Característica | Visão Simples | Visão Complexa |
|---|---|---|
| Tabelas envolvidas | Uma única tabela | Uma ou múltiplas tabelas |
| Funções agregadas | Não utiliza | Pode encluir |
| Cláusula GROUP BY | Não utilizada | Frequentemente presente |
| Operações DML | Permitidas | Restritas ou parcialmente permitidas |
Criação de Visões
A sintaxe básica para criar uma visão envolve a cláusula CREATE VIEW com uma subconsulta:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW nome_visao
[(apelido_coluna1 [, apelido_coluna2]...)]
AS subconsulta
[WITH CHECK OPTION [CONSTRAINT nome_restricao]]
[WITH READ ONLY [CONSTRAINT nome_restricao]];
Exemplo prático: criar uma visão para filtrar funcionários de um departamento específico.
CREATE VIEW func_dept_a
AS
SELECT id_func, nome_func, salario
FROM tabela_funcionarios
WHERE cod_dept = 10;
Para visualizar a estrutura da visão:
DESCRIBE func_dept_a;
Ao definir apelidos nas colunas da subconsulta, eles devem ser usados nas consultas posteriores:
CREATE VIEW func_sal_anual
AS
SELECT id_func ID, nome_func NOME, salario * 12 SALARIO_ANUAL
FROM tabela_funcionarios
WHERE cod_dept = 10;
Consultando a visão:
SELECT * FROM func_sal_anual;
Os resultados refletem os apelidos definidos, e o servidor Oracle resolve a consulta na tabela base subjacente.
Modificação de Visões
Utilize CREATE OR REPLACE VIEW para alterar uma visão existente, garantindo que os apelidos nas colunas correspondam à subconsulta:
CREATE OR REPLACE VIEW func_dept_a
(id, nome, sal, dept_cod)
AS
SELECT id_func, nome_func, salario, cod_dept
FROM tabela_funcionarios
WHERE cod_dept = 10;
Após a modificação, a consulta exibirá as novas colunas definidas:
SELECT * FROM func_dept_a;
Visões Complexas
Visões que envolvem múltiplas tabelas ou agregações são consideradas complexas. Exemplo com funções de grupo:
CREATE VIEW resumo_dept
(nome_dept, sal_minimo, sal_maximo, sal_medio)
AS
SELECT d.nome_dept, MIN(f.salario), MAX(f.salario), AVG(f.salario)
FROM tabela_funcionarios f, tabela_departamentos d
WHERE f.cod_dept = d.cod_dept
GROUP BY d.nome_dept;
Consultando o resumo:
SELECT * FROM resumo_dept;
Operações DML em Visões
Regras para operações de inserção: não são permitidas quando a visão contém funções agregadas, GROUP BY, DISTINCT, ROWNUM, expressões nas colunas ou se colunas NOT NULL da tabela base não estão incluídas.
Para atualizações: restrições semelhantes, exceto para colunas NOT NULL.
Uso do WITH CHECK OPTION
Esta cláusula garante que alterações DML respeitem a condição da visão. Qualquer operação que viole a restrição será rejeitada:
CREATE OR REPLACE VIEW func_dept_b
AS
SELECT *
FROM tabela_funcionarios
WHERE cod_dept = 20
WITH CHECK OPTION CONSTRAINT ck_dept_b;
Proteção contra DML com WITH READ ONLY
Para bloquear totalmente operações DML, utilize WITH READ ONLY. Qualquer tentativa de modificação gerará um erro:
CREATE OR REPLACE VIEW func_dept_c
(num_func, nome_cargo)
AS
SELECT id_func, cargo
FROM tabela_funcionarios
WHERE cod_dept = 30
WITH READ ONLY;
Remoção de Visões
A exclusão de uma visão remove apenas sua definição; os dados na tabela base permanecem intactos:
DROP VIEW func_dept_a;
Visões Temporárias
Subconsultas na cláusula FROM atuam como visões temporárias, não persistindo como objetos do banco de dados. Elas são úteis para consultas ad-hoc.
Análise Top-N
A análise Top-N identifica os N maiores ou menores valores em uma coluna. Utilize ROWNUM em conjunto com uma subconsulta ordenada:
SELECT [colunas], ROWNUM
FROM (SELECT [colunas]
FROM tabela
ORDER BY coluna_top_n DESC)
WHERE ROWNUM <= N;
Exemplo: encontrar os três maiores salários:
SELECT ROWNUM as POSICAO, nome_func, salario
FROM (SELECT nome_func, salario
FROM tabela_funcionarios
ORDER BY salario DESC)
WHERE ROWNUM <= 3;
Os resultados mostram a posição, nome e salário dos funcionários mais bem remunerados.