MySQL: Criação e uso de visualizações no MySQL

Última atualização: 2026-08-26

Uma visualização é uma tabela virtual — ela encapsula consultas complexas em uma interface simples.

Esta aula aborda a criação, o uso e o gerenciamento de visualizações.

100%
graph TB
    A[How Views Work] --> B[CREATE VIEW DefinitionSQL]
    B --> C[StorageSQLDefinition]
    C --> D[When querying a view]
    D --> E[Expand to the bottom layerSQL]
    E --> F[Execute a query on the underlying table]
    F --> G[Return Results]
    B --> H[WITH CHECK OPTION]
    H --> I[When modifying data<br/>Validate View Conditions]

1. O que você vai aprender


2. Cenários da vida real

(1) Problema: ter que escrever consultas complexas repetidamente

Muitas vezes preciso consultar as “estatísticas de pedidos dos clientes ativos”, mas a consulta SQL é muito longa:

SQL
SELECT c.name, COUNT(o.id), SUM(o.amount)
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE c.status = 'active'
GROUP BY c.id;

Tenho que escrever isso toda vez.

(2) Solução para o problema de visualização

SQL
CREATE VIEW active_customer_orders AS
SELECT c.name, COUNT(o.id) AS order_count, SUM(o.amount) AS total_amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
WHERE c.status = 'active'
GROUP BY c.id;

-- Query the view directly in the future
SELECT * FROM active_customer_orders;

3. Criação de uma visualização

▶ Exemplo: Visualização básica

SQL
-- Create a View
CREATE VIEW v_active_users AS
SELECT id, username, email, created_at
FROM users
WHERE status = 'active';

-- Using Views(Query like a table)
SELECT * FROM v_active_users;
SELECT * FROM v_active_users WHERE created_at >= '2026-01-01';
▶ Experimente

▶ Exemplo: Visualizações complexas

SQL
-- Order Statistics View
CREATE VIEW v_order_stats AS
SELECT 
    c.id AS customer_id,
    c.name AS customer_name,
    COUNT(o.id) AS total_orders,
    SUM(o.amount) AS total_amount,
    AVG(o.amount) AS avg_amount,
    MAX(o.order_date) AS last_order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name;
▶ Experimente

4. Visões x Tabelas

Dimensão Visualização Tabela
Armazenamento de dados Sem armazenamento (virtual) Armazena dados reais
Atualização Restrições (podem ser atualizadas na Visualização Simples) Podem ser livremente adicionadas, excluídas ou modificadas
Desempenho Recalculado a cada consulta Lido diretamente
Objetivo Simplificar consultas e controle de acesso Armazenar dados

5. Modificação e exclusão de visualizações

▶ Exemplo: Visão da Administração

SQL
-- Edit View
ALTER VIEW v_active_users AS
SELECT id, username, email, phone, created_at
FROM users
WHERE status = 'active' AND email_verified = TRUE;

-- or use CREATE OR REPLACE
CREATE OR REPLACE VIEW v_active_users AS
SELECT id, username, email FROM users WHERE status = 'active';

-- Delete View
DROP VIEW IF EXISTS v_active_users;

-- View View Definition
SHOW CREATE VIEW v_active_users;
▶ Experimente

6. COM A OPÇÃO DE CHEQUE

Certifique-se de que os dados modificados por meio de uma visualização continuem atendendo aos critérios dessa visualização.

▶ Exemplo: OPÇÃO DE VERIFICAÇÃO

SQL
CREATE VIEW v_active_users AS
SELECT * FROM users WHERE status = 'active'
WITH CHECK OPTION;

-- Allowed: status is active
UPDATE v_active_users SET username = 'new_name' WHERE id = 1;

-- Prohibited: After the revision status is no longer active, will be rejected
UPDATE v_active_users SET status = 'inactive' WHERE id = 1;
-- ERROR: CHECK OPTION failed
▶ Experimente

7. Casos de uso para visualizações

Cenário Descrição
Simplificar consultas complexas Encapsular JOINs entre várias tabelas e oferecer uma interface simples
Controle de acesso Exibir apenas os campos selecionados aos usuários
Abstração de dados Ocultação de alterações na estrutura da tabela subjacente
Estatísticas do relatório Lógica estatística predefinida

▶ Exemplo: Controle de acesso

SQL
-- Create a view that contains only public information
CREATE VIEW v_user_public AS
SELECT id, username, avatar FROM users;

-- Grant only view permissions to regular users
GRANT SELECT ON mydb.v_user_public TO 'readonly_user'@'localhost';
▶ Experimente

❓ Perguntas Frequentes

P: É possível criar índices em visualizações? R: Não. As visualizações são tabelas virtuais sem armazenamento real. As consultas em visualizações dependem dos índices das tabelas subjacentes para otimização.

P: As visualizações podem ser aninhadas? R: Sim, CREATE VIEW v2 AS SELECT * FROM v1. No entanto, o aninhamento excessivo pode afetar o desempenho.

P: Os dados na visualização são em tempo real? R: Sim. A visualização é recalculada a partir das tabelas subjacentes a cada consulta, de modo que você vê os dados mais recentes.

P: As visualizações ocupam espaço de armazenamento? R: Não, não ocupam. As visualizações armazenam apenas a definição SQL; não armazenam os dados propriamente ditos.

P: As visualizações podem melhorar o desempenho? R: Não. As visualizações são apenas um recurso sintático; o SQL subjacente é reexecutado a cada consulta. A otimização do desempenho deve se basear em índices.


📖 Resumo


📝 Exercícios

  1. Problema básico (Dificuldade: ⭐): Crie uma visualização que exiba apenas o ID, o nome de usuário e o e-mail dos usuários ativos.

  2. Exercício avançado (Dificuldade: ⭐⭐): Crie uma visualização de estatísticas de pedidos que inclua o nome do cliente, o número de pedidos e o valor total.

  3. Desafio (Dificuldade: ⭐⭐⭐): Implemente o controle de acesso usando visualizações; crie uma visualização somente leitura e conceda acesso a usuários específicos.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%