Capítulo 2
5- Visões e Visões Temporárias
Em alguns casos, algumas consultas que fazemos seriam mais facilmente feitas se a estrutura de tabelas fosse diferente.
Ou seja, podem existir situações em que sintamos necessidade de organizar ou acessar os dados de forma diferente da organização do banco de dados. Mas nem sempre é possível alterar a estrutura vigente.
Nesses casos podemos criar uma view.
Consideremos o nosso banco de dados livraria. Se por exemplo temos uma situação em que fazemos frequentemente uma consulta no título de um livro, seu preço, o nome da editora e a descrição do assunto. Essas informações estão contidas em três tabelas diferentes. Podemos obviamente usar junção para acessar essas informações. Porém se a consulta é feita com frequencia, seria mais conveniente termos uma tabela com esses dados... Mas nem sempre podemos criar tabelas...
Uma opção é criarmos uma tabela virtual com essas informações.
Essas tabelas virtuais são as chamadas de visões.
Definição de View
Visões são tabelas virtuais cujo conteúdo provém de tabelas reais. Os dados que as compõem são definidos a partir de comandos SELECT realizados sobre as tabelas (reais) do banco de dados. Os dados continuam armazenados nas tabelas reais. Cada vez que fazemos a consulta sobre uma visão o SGBD busca os dados nas tabelas reais e faz a consulta sobre a visão.
No SQL as visões podem ser permanentes ou temporárias. Ou seja, a visão pode ficar armazenada no SGBD ou ser usada apenas na seção aberta no momento.
Mas no Mysql só podemos criar visões permanentes.
Para criar uma visão use CREATE VIEW:
CREATE VIEW
CREATE VIEW NOME_VISAO
as
COMANDO_de_CONSULTA
Por exemplo, o comando view pode ser usado no banco de dados de livraria.
Exemplo 1
Criar uma visão que contém o título de livros, seus praços, o nome da editora que os publicou e a descrição de seus assuntos.
Exemplo 1
CREATE VIEW LIVRO_EDITORA_ASSUNTO
AS
SELECT titulo,preco, nome as editora, descricao as assunto
from livro
INNER JOIN editora ED
ON editora = ED.codigo
INNER JOIN assunto
ON assunto.sigla=livro.assunto
----------------------------------------
mysql> CREATE VIEW LIVRO_EDITORA_ASSUNTO
AS SELECT titulo,preco, nome as editora, descricao as assunto
from livro
INNER JOIN editora ED ON editora = ED.codigo
INNER JOIN assunto ON assunto.sigla=livro.assunto;
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+-----------------------+
| Tables_in_livraria |
+-----------------------+
| LIVRO_EDITORA_ASSUNTO |
| assunto |
| editora |
| livro |
+-----------------------+
4 rows in set (0.01 sec)
Agora, podemos consultar a visão como se fosse uma tabela do banco de dados.
Por exemplo podemos fazer:Exemplo 1, continuação
mysql> show tables;
+-----------------------+
| Tables_in_livraria |
+-----------------------+
| LIVRO_EDITORA_ASSUNTO |
| assunto |
| editora |
| livro |
+-----------------------+
4 rows in set (0.01 sec)
mysql> select * from LIVRO_EDITORA_ASSUNTO;
+-----------------------------------+--------+-----------------------+----------------+
| titulo | preco | editora | assunto |
+-----------------------------------+--------+-----------------------+----------------+
| Banco de Dados para Web | 31.20 | Mirandela Editora | Banco de Dados |
| Programando em Linguagem C | 30.00 | Mirandela Editora | Programação |
| Programando em Linguagem C++ | 111.50 | Editora Ilhas Tijucas | Programação |
| Banco de Dados na Bioinformática | 48.00 | Editora via-norte | Banco de Dados |
| Redes de Computadores | 42.00 | Editora via-norte | Redes |
| teste | 45.00 | Maria Jose Editora | Programação |
+-----------------------------------+--------+-----------------------+----------------+
6 rows in set (0.10 sec)
Exemplo 2: Consulta sobre uma VIEW
Obtenha o título, o nome da editora e a descrição do assunto dos livros que possuem preço superior a R$ 45,00. Ordene a listagem pelo título do livro.
Exemplo 2
mysql> select titulo,editora,assunto
-> from LIVRO_EDITORA_ASSUNTO
-> where preco > 45
-> order by titulo;
+-----------------------------------+-----------------------+----------------+
| titulo | editora | assunto |
+-----------------------------------+-----------------------+----------------+
| Banco de Dados na Bioinformática | Editora via-norte | Banco de Dados |
| Programando em Linguagem C++ | Editora Ilhas Tijucas | Programação |
+-----------------------------------+-----------------------+----------------+
2 rows in set (0.00 sec)
Apagando uma VIEW
Para apagar uma visão use DROP VIEW:
DROP VIEW
DROP VIEW LIVRO_EDITORA_ASSUNTO
Visão Temporária
Para criarmos uma visão temporária usamos a estrutura com WITH:
WITH NOME_VISAO_TEMPORARIA
as
(comandos definicao visao)
COMANDOS_DE_CONSULTA
Exemplo 3. Repita a consulta anterior usando uma visão temporária.
Exemplo 3
mysql> with liv_edi_ass as ( select titulo,preco,nome as editora,descricao as assunto from livro inner join editora ed on editora = ed.codigo inn
er join assunto on assunto.sigla = livro.assunto ) select titulo,editora,assunto from liv_edi_ass where preco > 45 order by titulo;
+-----------------------------------+-----------------------+----------------+
| titulo | editora | assunto |
+-----------------------------------+-----------------------+----------------+
| Banco de Dados na Bioinformática | Editora via-norte | Banco de Dados |
| Programando em Linguagem C++ | Editora Ilhas Tijucas | Programação |
+-----------------------------------+-----------------------+----------------+
2 rows in set (0.01 sec)
mysql> show tables;
+-----------------------+
| Tables_in_livraria |
+-----------------------+
| LIVRO_EDITORA_ASSUNTO |
| assunto |
| editora |
| livro |
+-----------------------+
4 rows in set (0.00 sec)
mysql> show full tables;
+-----------------------+------------+
| Tables_in_livraria | Table_type |
+-----------------------+------------+
| LIVRO_EDITORA_ASSUNTO | VIEW |
| assunto | BASE TABLE |
| editora | BASE TABLE |
| livro | BASE TABLE |
+-----------------------+------------+
4 rows in set (0.01 sec)
O resultado obtido foi o mesmo da visão que gerou a view "LIVRO_EDITORA_ASSUNTO" mas agora não foi criada view alguma. Veja que podemos usar o comando SHOW FULL TABLES para verificar o que é tabela e o que é VIEW no banco de dados.
Criando outras visões
As visões não precisam ser criadas somente com os dados do próprio banco. Podemos criar visões com dados externos ao banco. Por exemplo podemos criar visões para armazenar dados de dia e hora. Veja o exemplo a seguir.
Exemplo 4: Armazene o dia e o horário atual no banco de dados corrente.
Exemplo 4
mysql> create view Hoje as
-> select CURRENT_DATE;
Query OK, 0 rows affected (0.11 sec)
mysql> show full tables;
+-----------------------+------------+
| Tables_in_livraria | Table_type |
+-----------------------+------------+
| Hoje | VIEW |
| LIVRO_EDITORA_ASSUNTO | VIEW |
| assunto | BASE TABLE |
| editora | BASE TABLE |
| livro | BASE TABLE |
+-----------------------+------------+
5 rows in set (0.01 sec)
mysql> create view
-> DiaHorario as
-> select CURRENT_DATE,CURRENT_TIME;
Query OK, 0 rows affected (0.09 sec)
mysql> show full tables;
+-----------------------+------------+
| Tables_in_livraria | Table_type |
+-----------------------+------------+
| DiaHorario | VIEW |
| Hoje | VIEW |
| LIVRO_EDITORA_ASSUNTO | VIEW |
| assunto | BASE TABLE |
| editora | BASE TABLE |
| livro | BASE TABLE |
+-----------------------+------------+
6 rows in set (0.01 sec)
mysql> select * from DiaHorario;
+--------------+--------------+
| CURRENT_DATE | CURRENT_TIME |
+--------------+--------------+
| 2021-01-05 | 07:53:11 |
+--------------+--------------+
1 row in set (0.00 sec)