DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

SQL: Views

Introdução

Uma view é uma consulta salva com nome — ela não armazena dados fisicamente (na maioria dos casos), apenas guarda a definição de um SELECT. Toda vez que você consulta a view, o banco executa a query por trás dela e devolve o resultado como se fosse uma tabela.

CREATE VIEW clientes_ativos AS
SELECT id, nome, email FROM clientes WHERE status = 'ativo';

-- Depois, você consulta como se fosse uma tabela normal:
SELECT * FROM clientes_ativos WHERE nome LIKE 'A%';
Enter fullscreen mode Exit fullscreen mode

Pense na view como um "apelido inteligente" para uma query complexa. Em vez de reescrever um JOIN de 4 tabelas toda vez, você cria a view uma vez e reutiliza SELECT * FROM minha_view.

Por que usar views (motivação real)

  1. Simplificação: esconder a complexidade de JOINs/subqueries repetitivos atrás de um nome simples.
  2. Segurança: dar acesso a uma view que expõe só algumas colunas (ex: sem salário, sem CPF), sem dar acesso à tabela real.
  3. Abstração/desacoplamento: se a estrutura das tabelas mudar, você ajusta só a view, e as queries que a usam continuam funcionando sem alteração.
  4. Reuso: centralizar lógica de negócio (ex: "o que conta como pedido válido") em um único lugar, em vez de repetir o mesmo WHERE em 10 queries diferentes.
  5. Legibilidade: transformar um relatório complicado em algo que qualquer pessoa entende: SELECT * FROM vendas_por_mes.

Criando Views

Sintaxe básica

CREATE VIEW nome_da_view AS
SELECT coluna1, coluna2, ...
FROM tabela
WHERE condicao;
Enter fullscreen mode Exit fullscreen mode

Exemplo simples

CREATE VIEW produtos_em_estoque AS
SELECT id, nome, preco, quantidade
FROM produtos
WHERE quantidade > 0;
Enter fullscreen mode Exit fullscreen mode

Agora, em vez de repetir WHERE quantidade > 0 toda vez, qualquer pessoa faz:

SELECT * FROM produtos_em_estoque ORDER BY preco DESC;
Enter fullscreen mode Exit fullscreen mode

Exemplo com JOIN (caso mais comum no mundo real)

Views brilham quando escondem a complexidade de múltiplas tabelas relacionadas:

CREATE VIEW pedidos_detalhados AS
SELECT 
  p.id AS pedido_id,
  c.nome AS cliente,
  pr.nome AS produto,
  p.quantidade,
  p.quantidade * pr.preco AS total,
  p.data_pedido
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id
JOIN produtos pr ON p.produto_id = pr.id;
Enter fullscreen mode Exit fullscreen mode

Sem a view, toda vez que alguém quisesse ver um pedido "completo" (com nome do cliente e do produto, não só os IDs), precisaria escrever esse JOIN triplo de novo. Com a view:

SELECT * FROM pedidos_detalhados WHERE cliente = 'Maria Silva';
Enter fullscreen mode Exit fullscreen mode

Modificando Views

Existem duas abordagens, dependendo do banco:

Abordagem 1: CREATE OR REPLACE VIEW (PostgreSQL, MySQL, Oracle)

Substitui a definição inteira da view de uma vez:

CREATE OR REPLACE VIEW produtos_em_estoque AS
SELECT id, nome, preco, quantidade, categoria
FROM produtos
WHERE quantidade > 0;
Enter fullscreen mode Exit fullscreen mode

Regra importante: CREATE OR REPLACE normalmente só permite adicionar colunas no final, ou mudar a lógica do WHERE/JOIN — você não pode remover uma coluna ou mudar a ordem das colunas existentes sem dar DROP na view primeiro. Se tentar, o banco geralmente recusa com um erro.

Abordagem 2: ALTER VIEW (SQL Server, também existe em outros)

ALTER VIEW produtos_em_estoque AS
SELECT id, nome, preco, quantidade, categoria
FROM produtos
WHERE quantidade > 0;
Enter fullscreen mode Exit fullscreen mode

Funciona de forma equivalente ao CREATE OR REPLACE, mas é a sintaxe usada no SQL Server (que não aceita CREATE OR REPLACE VIEW — lá, CREATE VIEW falha se a view já existir, e você precisa usar ALTER VIEW para modificar uma existente).

Por que "substituir" em vez de “editar campo por campo”?

Views não têm um equivalente ao ALTER TABLE ADD COLUMN — você não "adiciona uma coluna" a uma view incrementalmente. Você reescreve a query inteira com CREATE OR REPLACE/ALTER VIEW. Isso é diferente de tabelas, e costuma confundir quem vem de ALTER TABLE.

O que acontece com permissões e dependências ao modificar

  • Modificar uma view preserva as permissões (GRANT) já concedidas a ela na maioria dos bancos — não precisa re-conceder acesso.
  • Se outras views dependem da view que você está alterando (lembra do exemplo vendas_por_mes em cima de pedidos_detalhados?), mudar a view de baixo pode quebrar as views de cima se você remover uma coluna que elas usam. Vale sempre mapear as dependências antes de alterar uma view "de base".

Top comments (0)