Como criar VIEWS no MySQL

Neste artigo lhes apresento o conceito de VIEWS, um recurso presente na maioria dos SGBDs e muito útil na gestão e visualização de relatórios de seu banco de dados.

[ Hits: 6.728 ]

Por: Fábio Berbert de Paula em 08/05/2020 | Blog: https://fabio.automatizando.dev


Introdução



Você sabe o que são VIEWS? Views são tabelas virtuais que não armazenam dados, mas que servem apenas como ponte para visualização de dados em outras tabelas.

A grosso modo, eu diria que uma View nada mais é que o "bookmark" de uma consulta SQL.

A sintaxe de criação de uma VIEW é:

CREATE VIEW nome_da_view AS SELECT statement;

Para entendermos melhor, vou apresentar na prática a criação de duas views para o Viva o Linux, uma para apresentar o ranking dos top 10 autores de artigos e outra para o top 10 de dicas.

A sintaxe apresentada irá funcionar tanto no MySQL quanto no MariaDB. Acredito que também funcione em outros SGBDs, como PostgreSQL, Oracle etc.

O objetivo da dica é que ao final da criação das Views, seja possível levantar o ranking de artigos e dicas simplesmente com:

SELECT * FROM rankArtigos;
SELECT * FROM rankDicas;

Então vamos à criação da primeira View. Por motivos óbvios não postarei o schema das tabelas citadas, vocês terão acesso somente aos campos usados pela View, mas tenho certeza que será possível entender o propósito. Estando no console do MySQL ou no seu gerenciador preferido (DBeaver por exemplo), digite o seguinte SQL Script:

CREATE VIEW rankArtigos AS
SELECT
    COUNT(*) AS num, u.nome AS nome, a.usuario AS usuario
  FROM artigo AS a
  INNER JOIN usuario AS u
  ON a.estado='Publicado' AND a.usuario!='Removido' AND a.usuario=u.login
  GROUP by a.usuario
  ORDER BY num desc
  LIMIT 10

O que eu fiz? Peguei uma consulta complexa, grande e chata de digitar e a transformei em uma VIEW chamada rankArtigos. Agora toda vez que eu quiser repeti-la, ao invés de digitar tudo o que está do "SELECT" em diante, preciso apenas digitar:

mysql> SELECT * FROM rankArtigos;
+-----+----------------------------------------------+---------------+
| num | nome                                         | usuario       |
+-----+----------------------------------------------+---------------+
| 123 | Alessandro de Oliveira Faria (A.K.A. CABELO) | cabelo        |
| 110 | Xerxes Lins                                  | xerxeslins    |
|  82 | Fábio Berbert de Paula                       | fabio         |
|  76 | edps                                         | edps          |
|  64 | Juliao Junior                                | juliaojunior  |
|  61 | Alberto Federman Neto.                       | albfneto      |
|  53 | andre uebe                                   | andreuebe     |
|  52 | Guilherme RazGriz                            | razgriz       |
|  40 | Thiago Alves                                 | cvs           |
|  34 | Davidson Rodrigues Paulo                     | davidsonpaulo |
+-----+----------------------------------------------+---------------+

Vamos utilizar a mesma lógica e sintaxe para criar uma VIEW para o ranking de dicas:

CREATE VIEW rankDicas AS
SELECT
    COUNT(*) AS num, u.nome AS nome, d.usuario AS usuario
  FROM dica AS d
  INNER JOIN usuario AS u
  ON d.estado='Publicado' AND d.usuario!='Removido' AND d.usuario=u.login
  GROUP by d.usuario
  ORDER BY num desc
  LIMIT 10

Vamos testar:

mysql> SELECT * FROM rankDicas;
+-----+------------------------------------+--------------+
| num | nome                               | usuario      |
+-----+------------------------------------+--------------+
| 880 | Xerxes Lins                        | xerxeslins   |
| 297 | Fábio Berbert de Paula             | fabio        |
| 189 | Clodoaldo Santos                   | clodoaldops  |
| 187 | Daniel Lara Souza                  | danniel-lara |
| 184 | Andre (pinduvoz)                   | pinduvoz     |
| 171 | edps                               | edps         |
| 125 | Alberto Federman Neto.             | albfneto     |
| 118 | Luís Fernando C. Cavalheiro | lcavalheiro  |
| 108 | Juliao Junior                      | juliaojunior |
|  67 | Robson Fernando Gomes              | magotico     |
+-----+------------------------------------+--------------+

Bônus - ranking do Fórum

Por fim, não publicarei a sintaxe da VIEW do ranking do fórum, apenas sua saída:

mysql> SELECT * from rankForum;
+-------+------------------------------------+----------------+
| soma  | nome                               | usuario        |
+-------+------------------------------------+----------------+
| 34561 | Clodoaldo Santos                   | clodoaldops    |
| 18348 | Alberto Federman Neto.             | albfneto       |
| 14668 | Andre (pinduvoz)                   | pinduvoz       |
| 13750 | Izaias                             | izaias         |
| 12612 | Daniel Lara Souza                  | danniel-lara   |
|  9215 | Renato Carneiro Pacheco            | renato_pacheco |
|  9067 | Mauriciodez                        | Mauriciodez    |
|  8665 | Luís Fernando C. Cavalheiro        | lcavalheiro    |
|  7556 | Fábio                              | fba            |
|  5802 | André Canhadas                     | andrecanhadas  |
+-------+------------------------------------+----------------+

Agradecimento

Gostaria de dedicar este artigo ao Thiago Alves (cvs), que nos deixou precocemente em 2010, aos 26 anos de idade, vítima de uma parada cardio-respiratória. E mesmo 1 década depois ainda consta em nosso top 10 de autores de artigos.

Também não posso deixar de citar nossos novos membros que, principalmente nesta quarentena, tem contribuído bastante com conteúdo para a comunidade. Nesse ritmo em breve constarão em nossos rankings!

Gratidão por fazer parte de uma comunidade tão rica em compartilhamento de conhecimento, obrigado!

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Ativando o Modo Noturno via Linha de Comando no GNOME/Wayland

Como isolar seus projetos Python com virtualenv (ambiente virtual)

Linux na Globo! (Hoje, 05/10)

Zello - Transforme seu Android (e GNU/Linux) num Walkie Talkie

Criando gráficos com a classe JPGraph (parte 1)

Leitura recomendada

Entendendo o LDAP

OpenAI - Como usar uma Inteligência Artificial a seu favor

Instalação da Plataforma Hadoop

Implementação LDAP e Java

Injeção de SQL

  
Comentários
[1] Comentário enviado por cizordj em 12/05/2020 - 09:37h

Show de bola, gostei desses recursos da view


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts