Post

Views

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!

Fazendo o que precisa ser feito.

Esta postagem está licenciada sob CC BY 4.0 pelo autor.