No mundo do SQL, gastamos muito tempo escrevendo consultas complexas. E se você pudesse salvar uma consulta SELECT e tratá-la como uma tabela? É exatamente isso que uma VIEW faz.
Uma VIEW (ou “Visão”) não é uma tabela real. Ela não armazena dados. Pense nela como um atalho ou uma consulta pré-definida que recebe um nome.
Quando você consulta uma VIEW, o banco de dados (como o MySQL) simplesmente executa a consulta SELECT original que você usou para criá-la.
Por que usar VIEWs?
Existem dois motivos principais que justificam o uso de VIEWs em qualquer projeto:
- Simplificação: Se você precisa executar um
JOINcomplexo de cinco tabelas toda vez que gera um relatório, você pode salvar esseJOINcomo umaVIEW. A partir daí, em vez de 30 linhas de SQL, você escreve apenas:SELECT * FROM v_Relatorio_Complexo; - Segurança (Abstração): Este é o uso mais poderoso. Imagine uma tabela
Funcionarioscom colunas sensíveis comosalario. Você não quer que todos os usuários do banco vejam essa informação. Você pode criar umaVIEWque seleciona apenas as colunas “seguras” (comonomeecargo) e dar permissão de acesso ao usuário apenas nessaVIEW, e não na tabela original.
Exemplo Prático no MySQL
Vamos usar um cenário simples com duas tabelas:
SQL
-- Tabelas de exemplo
CREATE DATABASE IF NOT EXISTS Exemplo_Views;
USE Exemplo_Views;
CREATE TABLE Departamentos (
id_depto INT PRIMARY KEY,
nome_depto VARCHAR(100)
);
CREATE TABLE Funcionarios (
id_func INT PRIMARY KEY,
nome_func VARCHAR(150),
cargo VARCHAR(100),
salario DECIMAL(10, 2),
id_depto INT,
FOREIGN KEY (id_depto) REFERENCES Departamentos(id_depto)
);
-- Dados
INSERT INTO Departamentos VALUES (1, 'Engenharia'), (2, 'Marketing');
INSERT INTO Funcionarios VALUES
(101, 'Ana Silva', 'Engenheira Sênior', 14000.00, 1),
(102, 'Bruno Costa', 'Engenheiro Pleno', 9500.00, 1),
(103, 'Carla Mendes', 'Gerente de Marketing', 12000.00, 2);
Caso de Uso 1: Simplificando um JOIN
A consulta para ver funcionários e seus departamentos é um JOIN repetitivo:
SQL
SELECT F.nome_func, F.cargo, D.nome_depto
FROM Funcionarios AS F
JOIN Departamentos AS D ON F.id_depto = D.id_depto;
Vamos salvar isso como uma VIEW:
SQL
CREATE VIEW v_Funcionarios_Departamentos AS
SELECT
F.nome_func,
F.cargo,
D.nome_depto
FROM
Funcionarios AS F
JOIN
Departamentos AS D ON F.id_depto = D.id_depto;
Agora, para obter os mesmos dados, basta fazer:
SQL
-- Consulta simples!
SELECT * FROM v_Funcionarios_Departamentos;
Caso de Uso 2: Implementando Segurança
Queremos criar uma lista telefônica que não mostre o salário.
SQL
CREATE VIEW v_Lista_Telefonica AS
SELECT
nome_func AS Nome,
cargo AS Cargo,
nome_depto AS Departamento
FROM
v_Funcionarios_Departamentos; -- Sim, VIEWs podem ser baseadas em outras VIEWs
Se um usuário tiver permissão apenas para v_Lista_Telefonica, ele nunca saberá que a coluna salario existe.
Como Gerenciar VIEWs
O gerenciamento de VIEWs é direto:
1. Alterar uma VIEW (ALTER VIEW ou CREATE OR REPLACE)
A forma mais segura de modificar uma VIEW sem precisar dar DROP nela primeiro é usando CREATE OR REPLACE VIEW:
SQL
CREATE OR REPLACE VIEW v_Lista_Telefonica AS
SELECT
nome_func AS Nome,
cargo AS Cargo
-- Removemos o departamento da visão
FROM
Funcionarios;
2. Excluir uma VIEW (DROP VIEW)
Isso remove apenas a VIEW (o “atalho”). Os dados nas tabelas originais (Funcionarios, Departamentos) permanecem intactos.
SQL
DROP VIEW v_Lista_Telefonica;
Limitações Importantes
VIEWs são poderosas, mas não são mágicas. Tenha em mente dois pontos:
- Performance: Uma
VIEWnão armazena os dados (no MySQL padrão). Se suaVIEWfaz umJOINem tabelas de milhões de linhas, essa consulta pesada será executada toda vez que você chamar aVIEW. Ela simplifica a escrita, não necessariamente o processamento. - Atualizações (
UPDATE/INSERT): É possível, em casos muito específicos (geralmenteVIEWs baseadas em uma única tabela), fazerUPDATEouINSERTatravés daVIEW, o que altera a tabela original. No entanto, isso é complexo e não é recomendado paraVIEWs que envolvemJOINs ou agregações (GROUP BY). TrateVIEWs como ferramentas de leitura (SELECT).
Conclusão
VIEWs são uma ferramenta essencial em SQL. Elas limpam seu código, reduzem a repetição de JOINs complexos e fornecem uma camada de segurança robusta para controlar exatamente quais dados os usuários podem acessar.

