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.
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 é:
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:
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:
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;
Vamos testar:
mysql> SELECT * FROM rankDicas;
mysql> SELECT * from rankForum;
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!
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;
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
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
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!