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.
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
- CREATE VIEW: Criar uma visualização
- A diferença entre visualizações e tabelas
- Modificar e excluir visualizações
- Casos de uso para visualizações
- COM OPÇÃO DE CHEQUE
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:
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
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
-- 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';
▶ Exemplo: Visualizações complexas
-- 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;
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
-- 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;
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
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
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
-- 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';
❓ 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
- Visualizações são tabelas virtuais que não armazenam dados; elas são recalculadas a cada consulta.
- CREATE VIEW para criar, ALTER VIEW para modificar, DROP VIEW para excluir
- COM OPÇÃO DE VERIFICAÇÃO Garante que as modificações atendam às condições da visualização
- Aplicações: Consultas simplificadas, Controle de acesso, Abstração de dados, Relatórios e análises
📝 Exercícios
-
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.
-
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.
-
Desafio (Dificuldade: ⭐⭐⭐): Implemente o controle de acesso usando visualizações; crie uma visualização somente leitura e conceda acesso a usuários específicos.