SQL views
Vamos aprender a criar, usar, bloquear, restringir e DML’s com views.
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 CLIENTESCreate 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 CLIENTESExibindo a nossa view:
SELECT *
FROM NAME_CPF_CLIENTNote 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 CLIENTESPronto! 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 CLIENTESAgora chamamos e view acima e ordenamos fora dela:
SELECT *
FROM ORDER_NAME_CPF
ORDER BY CPF DESCBloqueando 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:
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_PORIDVENDANote 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:
OK, mas eu posso adicionar uma coluna na tabela ITENS_VENDAS? vamos testar?
ALTER TABLE ITENS_VENDAS
ADD TESTE INT NULL;
GOResultado:
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:
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 OPTIONAgora 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:
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:
Criando a view:
-- CRIANDO A VIEW
CREATE VIEW VW_CLIENTE
AS
SELECT ID, NOME
FROM dbo.CLIENTESINSERT na view:
-- INSERINDO DADOS NA VIEW
INSERT INTO VW_CLIENTE
(NOME)
VALUES
('Eduardo')UPDATE na view:
-- ALTERANDO NOME NA VIEW
UPDATE VW_CLIENTE
SET NOME = 'eduardo silva'
WHERE NOME = 'Eduardo';DELETE na view:
-- DELETANDO NOME NA VIEW
DELETE
FROM VW_CLIENTE
WHERE NOME = 'Eduardo silva'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 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:
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!









