?>
1-mysql Básico
Exercícios
?>

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)


                        
voltar ao início da página