Sitemap
Daniel Amorim

Daniel Amorim

Engenheiro de computação, MBA em Data Science, apaixonado por dados e tecnologias!

SQL views

Vamos aprender a criar, usar, bloquear, restringir e DML’s com views.

7 min readFeb 26, 2023

--

Press enter or click to view image in full size

Hoje vamos falar sobre views em SQL, começo dizendo que views são consultas armazenadas em tabelas temporárias, sendo bem direto uma view é um nome que damos as nossas consultas e sempre que quisermos utiliza-las chamamos por este nome ao invés de refazer toda nossa consulta.

Vamos usar a tabela CLIENTES exemplificar a construção de views:

SELECT TOP (10) *
FROM CLIENTES
Tabela Clientes

Create View

Vamos começar do básico, vamos criar uma view que liste nome e CPF dos clientes:

CREATE VIEW NAME_CPF_CLIENT
AS
SELECT NOME, CPF
FROM CLIENTES

Exibindo a nossa view:

SELECT *
FROM NAME_CPF_CLIENT

Note que dentro da view podemos criar nossa consulta e chama-la posteriormente pelo nome sem precisar fica repedindo a construção da consulta.

Comandos de uma view

Agora que já criamos nossa primeira view, vamos descobrir mais sobre elas, primeiro temos que saber que, depois de criada a view é impossível modifica-la simplesmente usando o CREATE usando o mesmo nome, irá nos apresentar uma mensagem informando que a view já existe, então para modificar uma view ou exclui-la vamos usar:

  • ALTER VIEW (nome da view): Permite alterar sua consulta dentro da view.
  • DROP VIEW (nome da view): Exclui a view.

Vamos fazer um teste na nossa primeira view, altere-a colocando o comando TOP dentro dela (TOP (x) exibe as x primeiras linhas da tabela).

ALTER VIEW NAME_CPF_CLIENT
AS
SELECT TOP (10) NOME, CPF
FROM CLIENTES

Pronto! Nossa primeira view foi modificada!

Order By em uma view

A função Order By não funciona dentro de uma view, a não ser que tenha um comando TOP, OFFSET ou FOR XML junto da função.

Vamos tentar ordenar os CPFs dentro de uma view por ordem descendente:

CREATE VIEW ORDER_NAME_CPF
AS
SELECT NOME, CPF
FROM CLIENTES
ORDER BY CPF DESC;

Um erro é apresentado:


A cláusula ORDER BY é inválida em exibições, funções embutidas, tabelas
derivadas, subconsultas e expressões de tabela comuns, a menos que TOP,
OFFSET ou FOR XML também esteja especificado.

Mas usando TOP (10) é possível ordenar:

CREATE VIEW ORDER_NAME_CPF
AS
SELECT TOP (10) NOME, CPF
FROM CLIENTES
ORDER BY CPF DESC;

Ou podemos criar uma view sem order by, e ordenar por fora, quando a chamamos, vejamos:

CREATE VIEW ORDER_NAME_CPF
AS
SELECT TOP (10) NOME, CPF
FROM CLIENTES

Agora chamamos e view acima e ordenamos fora dela:

SELECT *
FROM ORDER_NAME_CPF
ORDER BY CPF DESC

Bloqueando tabelas com WITH SCHEMABINDING

Podemos criar views que bloqueia alteração da tabela ou colunas na qual ela dependa e que “afete na sua visualização”, pra isso usamos a palavra chave SCHEMABINDING, depois disso a alteração “de dados que afetem a view” na tabela principal só pode ser feita após a exclusão da view.

Vamos ver na prática usando a tabela chamada ITENS_VENDAS abaixo:

Tabela ITENS_VENDAS (OBS: A tabela tem 32 mil linhas a mais)

Vamos criar uma view que agrupe pelo IDVENDA e me dê o total de cada venda por ID:

CREATE VIEW VW_TTL_VENDA_PORIDVENDA
WITH SCHEMABINDING
AS
SELECT IDVENDA, SUM(TOTAL) AS TTL_VENDA_PORIDVENDA
FROM dbo.ITENS_VENDAS
GROUP BY IDVENDA

SELECT *
FROM VW_TTL_VENDA_PORIDVENDA

Note que a view criada acima faz referência à tabela ITENS_VENDAS, e ela está bloqueada com a palavra chave SCHEMABINDING, então vamos tentar excluir a tabela ITENS_VENDAS?

DROP TABLE ITENS_VENDAS;

Um erro é mostrado conforme esperado, pois a view não permite exclusão da tabela pois depende dela:

Press enter or click to view image in full size

OK, mas eu posso adicionar uma coluna na tabela ITENS_VENDAS? vamos testar?

ALTER TABLE ITENS_VENDAS
ADD TESTE INT NULL;
GO

Resultado:

Foi adicionado a coluna TESTE, pois não afeta em nada na view, com isso concluímos que podemos modificar sim a tabela dependente, desde que a modificação não afete no resultado da view.

Criando views com restrições CHECK OPTION

Podemos também criar views que restringem alteração/inserção de dados que não respeitem o/os filtro/filtros da própria view, por exemplo, se criamos uma view para filtrar clientes que comecem com a letra ‘D’, usando CHECK OPTION, restringimos automaticamente a alteração/inserção de clientes que não comecem com a letra ‘D’, vamos ver na prática usando a tabela clientes abaixo:

Tabela CLIENTES

Crie uma view que filtre somente clientes com a letra ‘d’, e use CHECK OPTION par restringir inserção de dados que não respeitem a regra:

CREATE VIEW VW_COM_OPTION
as
SELECT *
FROM CLIENTES
WHERE NOME LIKE 'd%'
-- O COMANDO ABAIXO AUTOMATICAMENTE RESTRINGE SOMENTE ÀS REGRAS
WITH CHECK OPTION

Agora vamos ver o resultado da view acima, deverá aparecer somente o cliente ‘daniel’:

Agora vamos tentar inserir na view um cliente com nome ‘pedro’:

INSERT INTO VW_COM_OPTION
(NOME)
VALUES
('pedro')

Resultado é um erro:

Mensagem 550, Nível 16, Estado 1, Linha 16
Falha ao tentar inserir ou atualizar. A exibição de destino especifica
WITH CHECK OPTION ou ultrapassa uma exibição que especifica WITH CHECK
OPTION e uma ou mais linhas resultantes da operação não se qualificam na
restrição CHECK OPTION.
A instrução foi finalizada.

Em resumo, usando CHECK OPTION a view não permite inserir ou modificar dados que ela mesmo não possa ler, pois foge às próprias regras, mas se eu quiser inserir dados que estão dentro das regras vai funcionar normalmente, vejamos adicionando o cliente ‘danilo’, como começa com ‘d’ vai permitir:

INSERT INTO VW_COM_OPTION
(NOME)
VALUES
('danilo')

Resultado:

Press enter or click to view image in full size

Criando DML dentro das views

Antes vamos entender o que são DML e DDL:

Get Daniel Amorim’s stories in your inbox

Join Medium for free to get updates from this writer.

DML: Data manipulation language, são comandos que interage diretamente com os dados dentro das tabelas, INSERT, UPDATE e DELETE.

DDL: Data definition language, comandos que interagem não com dados, mas sim com objetos do banco como as tabelas, são eles CREATE, DROP e ALTER.

Criando DML’s com as views:

Podemos usar as views para criar comandos INSERT, UPDATE e DELETE, assim como diretamente na tabela, porém mostraremos para que saibam que é possível sim, vejamos:

Vamos usar a tabela CLIENTES:

Tabela CLIENTES

Criando a view:

-- CRIANDO A VIEW 
CREATE VIEW VW_CLIENTE
AS
SELECT ID, NOME
FROM dbo.CLIENTES

INSERT na view:

-- INSERINDO DADOS NA VIEW 
INSERT INTO VW_CLIENTE
(NOME)
VALUES
('Eduardo')
Eduardo inserido

UPDATE na view:

-- ALTERANDO NOME NA VIEW
UPDATE VW_CLIENTE
SET NOME = 'eduardo silva'
WHERE NOME = 'Eduardo';
Eduardo alterado.

DELETE na view:

-- DELETANDO NOME NA VIEW
DELETE
FROM VW_CLIENTE
WHERE NOME = 'Eduardo silva'
Eduardo SIlva removido.

Exercícios da aula

Para nossos exercícios vamos usar 2 tabelas distintas, VENDAS e ITENS_VENDAS:

(Lembrando que as tabelas tem muito mais linhas, apenas usamos as imagens abaixo para exemplificar)

Tabela VENDAS:

Tabela VENDAS

Tabela ITENS_VENDAS:

Tabela ITENS_VENDAS

Exercício 01

Crie uma view VW_10_MAIORES, que una as tabelas VENDAS e ITENS_VENDAS e exiba as 10 vendas de maior valor total.

OBS: Esse é o único exercício resolvido, para visualizar a solução dos outros exercícios veja o vídeo da aula.

CREATE VIEW VW_10_MAIORES
AS
-- SELECIONA AS 10 VENDAS, SOMA COLUNA TOTAL E NOMEIA COMO MAIORES_VENDAS
SELECT TOP 10 V.IDVENDA, SUM(TOTAL) AS MAIORES_VENDAS
-- PEGA TABELA VENDAS NOMEIA COMO V
FROM VENDAS AS V
-- JUNTA COM ITENS_VENDAS PELOS SEUS IDS
JOIN ITENS_VENDAS AS IV ON (V.IDVENDA = IV.IDVENDA)
-- AGRUPA PELA IDVENDA
GROUP BY V.IDVENDA
-- ORDENA A COLUNA DA SUM(TOTAL)
ORDER BY SUM(TOTAL)

Retorno:

Solução exercício 01

Exercício 02

Crie uma view VW_VENDAS_5000_MAIS, que exiba os produtos da tabela ITENS_VENDAS cujo valor seja maior que 5000 e impeça inserir/atualizar produtos com valor abaixo de 5000.

Exercício 03

Insira usando a view acima, um item com valor 5000, e um item com valor 5001.

Exercício 04

Altere o item de valor 5001 criado acima para o valor 5002.

Exercício 05

Delete o item criado nos exercícios anteriores.

Por hoje é só pessoal, acesse aqui a aula sobre functions SQL!

Dica

Usem o site W3schools para treinar SQL, lá tem uma tabela prontinha para vocês brincarem e praticar o que foi aprendido aqui, teoria é bom mas HANDS ON é essencial para um bom aprendizado!

Clique aqui para acessar meu GitHub, segue lá dá essa força!

--

--

Daniel Amorim
Daniel Amorim

Written by Daniel Amorim

Engenheiro de computação, MBA em Data Science, apaixonado por dados e tecnologias!