Uma visão (view) é um resultado virtual gerado por uma consulta SELECT. Ao criá-la, o foco principal está em definir corretamente a instrução SQL que produzirá os dados desejados.
Características das Visões
Visões não armazenam dados fisicamente — são apenas representações lógicas de consultas executadas sobre tabelas reais. Quando os dados nas tabelas base mudam, a visão reflete automaticamente essas alterações. Embora seja possível realizar operações de INSERT, UPDATE e DELETE em algumas visões, elas estão sujeitas a restrições específicas.
Vantagens do Uso de Visões
- Simplificam consultas complexas, melhorando a legibilidade do código SQL.
- Aumentam a segurança: permitem conceder acesso controlado a colunas ou linhas específicas, mesmo quando as permissões diretas do banco não oferecem esse nível de granularidade.
Cenários Comuns de Utilização
- Ocultar colunas sensíveis, como salários ou dados pessoais, de usuários comuns.
- Consolidar informações provenientes de múltiplas tabelas relacionadas, facilitando o acesso a dados agregados sem repetir joins complexos.
Exemplo 1: Criando e Consultando uma Visão
Suponha três tabelas: usuarios, cursos e matriculas. Para listar todos os cursos de um usuário específico, normalmente seria necessário um JOIN triplo:
SELECT
m.id AS matricula_id,
u.nome AS aluno,
c.nome AS disciplina
FROM
usuarios u
LEFT JOIN matriculas m ON u.id = m.usuario_id
LEFT JOIN cursos c ON m.curso_id = c.id
WHERE
u.nome = 'João Silva';
Podemos encapsular essa lógica em uma visão chamada v_matriculas_alunos:
CREATE OR REPLACE VIEW v_matriculas_alunos AS
SELECT
m.id AS matricula_id,
u.nome AS aluno,
c.nome AS disciplina
FROM
usuarios u
JOIN matriculas m ON u.id = m.usuario_id
JOIN cursos c ON m.curso_id = c.id;
Agora, a consulat se torna simples e intuitiva:
SELECT aluno, disciplina
FROM v_matriculas_alunos
WHERE aluno = 'João Silva';
Exemplo 2: Operações de Modificação em Visões
Tentar atualizar campos de múltiplas tabelas simultaneamente via visão resultará em erro:
UPDATE v_matriculas_alunos
SET aluno = 'Carlos', disciplina = 'Python'
WHERE matricula_id = 5;
-- ERRO: Não é permitido modificar mais de uma tabela base.
No entanto, modificações são possíveis em cenários mais restritos:
Caso 1: Visão de Tabela Única
Crie uma visão simplificada apenas da tabela usuarios:
CREATE VIEW v_usuarios_basico AS
SELECT id, login, nome
FROM usuarios;
Agora, operações CRUD funcionam normalmente (desde que colunas obrigatórias não estejam ausentes):
INSERT INTO v_usuarios_basico (login, nome) VALUES ('novo_user', 'Novo Usuário');
UPDATE v_usuarios_basico SET nome = 'Nome Atualizado' WHERE id = 1;
DELETE FROM v_usuarios_basico WHERE nome = 'Novo Usuário';
Caso 2: Visão com Relacionamento — Modificação Parcial
Atualizações em uma única tabela base podem ser permitidas:
UPDATE v_matriculas_alunos
SET disciplina = 'Banco de Dados'
WHERE matricula_id = 2;
UPDATE v_matriculas_alunos
SET aluno = 'Maria Oliveira'
WHERE matricula_id = 3;
Mas operações como INSERT ou DELETE ainda falham, pois envolvem ambiguidade sobre onde persistir os dados.
Dicas Finais
- Otimize sempre as consultas subjacentes às visões — elas impactam diretamente o desempenho.
- Modificações em visões podem afetar várias linhas nas tabelas reais; revise cuidadosamente antes de executar.