Views
A definição mais correta de uma view é que ela representa uma consulta armazenada no seu banco de dados.
Parecido com CTEs ou Subqueries, utilizando elas nós conseguimos encapsular uma consulta principal e depois manipular atráves de outras consultas. A view trabalho com o mesmo conceito, a diferença é que você pode armazenar e manipular essas consultas como se fossem tabelas. Ela não fica limitada apenas ao escopo em que foi criada, diferente das CTE e Subqueries.
“Mas podemos misturas as duas?”
Sim, você pode criar uma view com subqueries e CTEs, um conceito não limita o outro, vai muito da sua necessidade.
Os principais benefícios de se ter uma view são:
- Você pode armazenar uma definição de consulta: Você não precisa ficar compartilhando o seu
SELECT
com os devs ou usuários, você compartilha apenas a view. A partir dessa view, eles podem realizar as consultas. - Restrição de acesso e mais segurança: Chega de dar acesso a tabelas para os colaboradores. O seu trabalho agora é entender a necessidade, criar uma consulta, adicionar ela em uma view e disponibilizar a view para quem quer consultar.
- Ter um plano de execução definido: Quando o usuário roda vários tipos de
SELECT
na sua base, ele faz o seu SGBD criar vários planos de execução para as consultas, se você liberar uma view o SGBD vai ter um plano de execução otimizado para a consulta em questão.
Sintaxe de criação:
1
2
3
4
5
6
7
8
CREATE VIEW nome_da_view
AS
SELECT
coluna1,
coluna2,
...
FROM tabela
WHERE condição
Criando uma VIEW Usando uma CTE
Aqui está o código de uma CTE que representa as vendas de 2021:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH vendas_2021 AS (
SELECT
id,
YEAR(date) [ano],
produto_id,
valor
FROM vendas
WHERE YEAR(date) = '2021'
)
SELECT
produto_id [Produto],
FORMAT(SUM(valor), 'C', 'pt-BR') [Total Vendido],
COUNT(*) [Quantidade Vendida]
FROM vendas_2021
GROUP BY produto_id
Vamos adicionar todo esse código abaixo de um comando simples: CREATE VIEW vendas_2021 AS
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE VIEW vendas_2021
AS
WITH vendas_2021 AS (
SELECT
id,
YEAR(date) [ano],
produto_id,
valor
FROM vendas
WHERE YEAR(date) = '2021'
)
SELECT
produto_id [Produto],
FORMAT(SUM(valor), 'C', 'pt-BR') [Total Vendido],
COUNT(*) [Quantidade Vendida]
FROM vendas_2021
GROUP BY produto_id
Ótimo se o retorno foi Commands completed successfully.
parabéns, você possui uma view em seu database.
Agora, imagino que você quer consultar essa view, é mais simples do que parece, você vai literalmente rodar um SELECT * FROM sua_view
1
2
3
SELECT
*
FROM vendas_2021
Incrível, não?
A melhor parte é que ela vai sempre atualizando conforme os novos dados são inseridos nas tabelas principais.
Ao invés de levar um consulta gigante para o seu Dashboard, consolide ela em um view. Vai ficar muito mais simples para quem for trabalhar com essa consulta.
Atualizando e Removendo Views
Da mesma forma que você utiliza CREATE
para criar, você utiliza o ALTER
para alterar e o DROP
para apagar.
ALTER VIEW
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ALTER VIEW vendas_2021
AS
WITH vendas_2021 AS (
SELECT
id,
YEAR(date) [Ano],
MONTH(date) [Mes],
produto,
valor
FROM vendas
WHERE YEAR(date) = '2021'
)
SELECT
produto [Produto],
Ano,
Mes,
FORMAT(SUM(valor), 'C', 'pt-BR') [Total Vendido],
COUNT(*) [Quantidade Vendida]
FROM vendas_2021
GROUP BY produto, Ano, Mes
Nesse caso o CEO que analisar as vendas mensalmente de cada produto, eu apenas adicionei o MONTH(date) [Mes]
e joguei o Ano
e o Mes
para o SELECT
.
DROP VIEW
:
1
DROP VIEW vendas_2021
Aqui não tem muita história, rodou o DROP
e o retorno foi Commands completed successfully.
não existe mais essa view na sua base.
Espero que tenha ficado claro a usabilidade e os benefícios de uma view, eu em particular gosto de utilizar bastante para controle de acessos e criação de relatórios/dashboards.
Obrigado por ler até aqui!