{"id":1438,"date":"2026-07-08T17:48:44","date_gmt":"2026-07-08T20:48:44","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/"},"modified":"2026-07-08T17:48:44","modified_gmt":"2026-07-08T20:48:44","slug":"aula-15-views-criando-e-gerenciando-visoes-de-dados","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/","title":{"rendered":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados"},"content":{"rendered":"<p>Bem-vindo \u00e0 Aula 15 do curso <strong>MySQL \u2014 Do Zero ao Avan\u00e7ado<\/strong>. Hoje, 8 de julho de 2026, mergulhamos em um dos recursos mais estrat\u00e9gicos do MySQL para profissionais de infraestrutura, desenvolvimento backend e an\u00e1lise de dados: as <strong>Views<\/strong> (vis\u00f5es). Em ambientes corporativos onde centenas de tabelas coexistem e as regras de neg\u00f3cio mudam constantemente, as <strong>Views<\/strong> funcionam como uma camada de abstra\u00e7\u00e3o que simplifica consultas complexas, refor\u00e7a a seguran\u00e7a e promove a independ\u00eancia l\u00f3gica dos dados. Nesta aula, vamos explorar o conceito de vis\u00f5es de dados, sua cria\u00e7\u00e3o, gerenciamento, boas pr\u00e1ticas e as armadilhas que podem comprometer a performance se n\u00e3o forem bem compreendidas. Em nossos projetos na JRT Technology Solutions, utilizamos <strong>Views<\/strong> diariamente para isolar l\u00f3gicas de relat\u00f3rio, ocultar colunas sens\u00edveis como senhas e dados financeiros cr\u00edticos, e garantir que aplica\u00e7\u00f5es legadas n\u00e3o quebrem quando a estrutura f\u00edsica das tabelas precisa evoluir.<\/p>\n<p>Ao concluir esta aula, voc\u00ea ser\u00e1 capaz de projetar <strong>Views<\/strong> simples e complexas utilizando <em>joins<\/em>, <em>subqueries<\/em> e fun\u00e7\u00f5es agregadas, compreender\u00e1 as limita\u00e7\u00f5es das <strong>Views<\/strong> atualiz\u00e1veis (<em>updatable views<\/em>) e dominar\u00e1 a cl\u00e1usula <strong>WITH CHECK OPTION<\/strong> para impor restri\u00e7\u00f5es de integridade. Tamb\u00e9m aprender\u00e1 a listar, modificar e excluir vis\u00f5es do dicion\u00e1rio de dados, identificar problemas de desempenho com o comando <strong>EXPLAIN<\/strong> aplicado a <strong>Views<\/strong>, e resolver os erros mais comuns enfrentados por DBAs em produ\u00e7\u00e3o. O conte\u00fado \u00e9 denso, com mais de 4.000 palavras, repleto de exemplos reais execut\u00e1veis do in\u00edcio ao fim \u2014 sem atalhos, sem &#8220;e assim por diante&#8221;.<\/p>\n<p>Se voc\u00ea acompanhou as aulas anteriores, j\u00e1 tem um ambiente MySQL funcional, sabe criar bancos, tabelas, \u00edndices e executar consultas com <strong>SELECT<\/strong>, <strong>JOIN<\/strong> e <strong>GROUP BY<\/strong>. Esse conhecimento \u00e9 essencial, pois uma <strong>View<\/strong> nada mais \u00e9 do que uma consulta armazenada com nome. Se ainda h\u00e1 d\u00favidas sobre esses fundamentos, recomendamos revisar as Aulas 8 a 12 antes de prosseguir. Para os demais, prepare seu terminal, abra o cliente MySQL e venha dominar as <strong>Views<\/strong> com a profundidade que o mercado exige.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>O conceito de <strong>View<\/strong> como consulta armazenada e suas vantagens em cen\u00e1rios reais de produ\u00e7\u00e3o<\/li>\n<li>A sintaxe completa do comando <strong>CREATE VIEW<\/strong> e suas cl\u00e1usulas opcionais<\/li>\n<li>Como construir <strong>Views<\/strong> simples, com <em>joins<\/em>, subconsultas e fun\u00e7\u00f5es de agrega\u00e7\u00e3o<\/li>\n<li>A diferen\u00e7a entre <strong>Views<\/strong> materializadas (inexistentes nativamente no MySQL) e <strong>Views<\/strong> l\u00f3gicas, e como simular materializa\u00e7\u00e3o<\/li>\n<li>O funcionamento das <strong>Views<\/strong> atualiz\u00e1veis e as restri\u00e7\u00f5es que as tornam <em>read-only<\/em><\/li>\n<li>O uso avan\u00e7ado da cl\u00e1usula <strong>WITH CHECK OPTION<\/strong> \u2014 <em>cascaded<\/em> e <em>local<\/em><\/li>\n<li>Comandos de gerenciamento: <strong>ALTER VIEW<\/strong>, <strong>DROP VIEW<\/strong>, <strong>SHOW CREATE VIEW<\/strong> e <strong>RENAME TABLE<\/strong> para views<\/li>\n<li>Impactos de performance, uso do <strong>EXPLAIN<\/strong> em <strong>Views<\/strong> e o perigo das <strong>Views<\/strong> aninhadas<\/li>\n<li>Os 5 erros mais comuns ao trabalhar com <strong>Views<\/strong> e como corrigi-los de forma definitiva<\/li>\n<li>M\u00e9tricas de verifica\u00e7\u00e3o e scripts de diagn\u00f3stico para validar a integridade das suas <strong>Views<\/strong><\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Para executar todos os exemplos desta aula sem interrup\u00e7\u00f5es, voc\u00ea precisa de um servidor MySQL na vers\u00e3o <strong>8.0<\/strong> ou superior \u2014 recomendamos a <strong>8.0.35<\/strong> ou mais recente. O MySQL 8.0 trouxe melhorias significativas no tratamento de <strong>Views<\/strong> com <em>Common Table Expressions<\/em> (CTEs) e fun\u00e7\u00f5es de janela, que exploraremos em exemplos. Se voc\u00ea estiver usando MySQL 5.7, a maioria dos comandos funcionar\u00e1, mas alguns recursos como <strong>WITH RECURSIVE<\/strong> dentro de <strong>Views<\/strong> estar\u00e3o indispon\u00edveis. Em nossos projetos na JRT Technology Solutions, padronizamos o MySQL 8.0 para todos os novos deployments justamente por essas vantagens.<\/p>\n<p>Certifique-se de ter um usu\u00e1rio com privil\u00e9gios <strong>CREATE VIEW<\/strong>, <strong>SHOW VIEW<\/strong> e <strong>DROP<\/strong> sobre o banco de dados de teste. Se voc\u00ea \u00e9 o administrador <em>root<\/em>, j\u00e1 possui todos os privil\u00e9gios. Vamos criar um banco de dados chamado <strong>aula_views<\/strong> e popul\u00e1-lo com tabelas de exemplo que simulam um sistema de vendas \u2014 clientes, produtos e pedidos. Execute cada bloco de c\u00f3digo na ordem exata que apresentamos. A sa\u00edda esperada aparece logo ap\u00f3s cada comando, para que voc\u00ea possa comparar e validar seu progresso.<\/p>\n<p>Abra seu terminal e conecte-se ao MySQL:<\/p>\n<pre><code># Conectando ao MySQL como root (substitua pela sua senha)\nmysql -u root -p\n<\/code><\/pre>\n<p>Dentro do prompt do MySQL, vamos criar o ambiente de testes:<\/p>\n<pre><code>-- Cria\u00e7\u00e3o do banco de dados da aula\nCREATE DATABASE IF NOT EXISTS aula_views\nCHARACTER SET utf8mb4\nCOLLATE utf8mb4_unicode_ci;\n\n-- Seleciona o banco rec\u00e9m-criado\nUSE aula_views;\n\n-- Tabela de clientes\nCREATE TABLE clientes (\n    cliente_id INT AUTO_INCREMENT PRIMARY KEY,\n    nome VARCHAR(100) NOT NULL,\n    email VARCHAR(150) UNIQUE NOT NULL,\n    cidade VARCHAR(80),\n    data_cadastro DATE NOT NULL,\n    ativo TINYINT(1) DEFAULT 1\n) ENGINE=InnoDB;\n\n-- Tabela de produtos\nCREATE TABLE produtos (\n    produto_id INT AUTO_INCREMENT PRIMARY KEY,\n    descricao VARCHAR(200) NOT NULL,\n    preco DECIMAL(10,2) NOT NULL CHECK (preco > 0),\n    estoque INT NOT NULL DEFAULT 0,\n    categoria VARCHAR(50)\n) ENGINE=InnoDB;\n\n-- Tabela de pedidos (cabe\u00e7alho)\nCREATE TABLE pedidos (\n    pedido_id INT AUTO_INCREMENT PRIMARY KEY,\n    cliente_id INT NOT NULL,\n    data_pedido DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,\n    status ENUM('pendente','aprovado','enviado','cancelado') NOT NULL DEFAULT 'pendente',\n    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id)\n        ON DELETE RESTRICT\n        ON UPDATE CASCADE\n) ENGINE=InnoDB;\n\n-- Tabela de itens dos pedidos (detalhe)\nCREATE TABLE itens_pedido (\n    item_id INT AUTO_INCREMENT PRIMARY KEY,\n    pedido_id INT NOT NULL,\n    produto_id INT NOT NULL,\n    quantidade INT NOT NULL CHECK (quantidade > 0),\n    preco_unitario DECIMAL(10,2) NOT NULL,\n    FOREIGN KEY (pedido_id) REFERENCES pedidos(pedido_id)\n        ON DELETE CASCADE\n        ON UPDATE CASCADE,\n    FOREIGN KEY (produto_id) REFERENCES produtos(produto_id)\n        ON DELETE RESTRICT\n        ON UPDATE CASCADE\n) ENGINE=InnoDB;\n<\/code><\/pre>\n<pre><code class=\"output\">Query OK, 1 row affected (0,01 sec)\nQuery OK, 0 rows affected (0,00 sec)\nQuery OK, 0 rows affected (0,02 sec)\nQuery OK, 0 rows affected (0,02 sec)\nQuery OK, 0 rows affected (0,01 sec)\nQuery OK, 0 rows affected (0,02 sec)\n<\/code><\/pre>\n<p>Agora vamos inserir dados de exemplo para que nossas <strong>Views<\/strong> tenham conte\u00fado real para consulta:<\/p>\n<pre><code>-- Populando clientes\nINSERT INTO clientes (nome, email, cidade, data_cadastro, ativo) VALUES\n('Ana Silva', 'ana.silva@email.com', 'S\u00e3o Paulo', '2025-01-15', 1),\n('Bruno Costa', 'bruno.costa@email.com', 'Rio de Janeiro', '2025-03-20', 1),\n('Carla Mendes', 'carla.mendes@email.com', 'Belo Horizonte', '2025-06-10', 0),\n('Daniel Oliveira', 'daniel.oliveira@email.com', 'S\u00e3o Paulo', '2025-11-05', 1),\n('Eduarda Lima', 'eduarda.lima@email.com', 'Curitiba', '2026-02-28', 1);\n\n-- Populando produtos\nINSERT INTO produtos (descricao, preco, estoque, categoria) VALUES\n('Notebook XPS 15', 7500.00, 12, 'Eletr\u00f4nicos'),\n('Monitor 27\" 4K', 2800.00, 8, 'Eletr\u00f4nicos'),\n('Teclado Mec\u00e2nico RGB', 450.00, 30, 'Perif\u00e9ricos'),\n('Mouse Gamer Wireless', 320.00, 25, 'Perif\u00e9ricos'),\n('Webcam Full HD', 580.00, 15, 'Perif\u00e9ricos'),\n('Hub USB-C 7 portas', 220.00, 40, 'Acess\u00f3rios');\n\n-- Populando pedidos\nINSERT INTO pedidos (cliente_id, data_pedido, status) VALUES\n(1, '2026-06-01 10:30:00', 'aprovado'),\n(1, '2026-07-05 14:20:00', 'pendente'),\n(2, '2026-06-15 09:45:00', 'enviado'),\n(3, '2026-05-20 16:10:00', 'cancelado'),\n(4, '2026-07-01 11:00:00', 'aprovado'),\n(5, '2026-07-07 08:30:00', 'pendente');\n\n-- Populando itens dos pedidos\nINSERT INTO itens_pedido (pedido_id, produto_id, quantidade, preco_unitario) VALUES\n(1, 1, 1, 7500.00),\n(1, 3, 2, 450.00),\n(2, 2, 1, 2800.00),\n(3, 4, 3, 320.00),\n(3, 5, 1, 580.00),\n(4, 1, 1, 7500.00),\n(5, 6, 5, 220.00),\n(6, 2, 1, 2800.00),\n(6, 4, 2, 320.00);\n<\/code><\/pre>\n<pre><code class=\"output\">Query OK, 5 rows affected (0,01 sec)\nRecords: 5  Duplicates: 0  Warnings: 0\nQuery OK, 6 rows affected (0,01 sec)\nRecords: 6  Duplicates: 0  Warnings: 0\nQuery OK, 6 rows affected (0,01 sec)\nRecords: 6  Duplicates: 0  Warnings: 0\nQuery OK, 9 rows affected (0,01 sec)\nRecords: 9  Duplicates: 0  Warnings: 0\n<\/code><\/pre>\n<p>Com o ambiente preparado, estamos prontos para explorar o universo das <strong>Views<\/strong> no MySQL.<\/p>\n<h3>O que s\u00e3o Views? \u2014 O conceito fundamental por tr\u00e1s das vis\u00f5es de dados<\/h3>\n<p>Uma <strong>View<\/strong> (vis\u00e3o) no MySQL \u00e9 uma consulta <strong>SELECT<\/strong> armazenada no dicion\u00e1rio de dados com um nome pr\u00f3prio. Ela n\u00e3o armazena dados fisicamente \u2014 pense nela como uma &#8220;tabela virtual&#8221; cujo conte\u00fado \u00e9 gerado dinamicamente toda vez que voc\u00ea a consulta. O MySQL armazena apenas a defini\u00e7\u00e3o da <strong>View<\/strong> (a string da consulta SQL) na tabela de metadados, geralmente no <em>information_schema<\/em>. Quando voc\u00ea executa um <strong>SELECT<\/strong> contra uma <strong>View<\/strong>, o servidor transforma sua consulta, combina-a com a defini\u00e7\u00e3o armazenada e executa o plano de execu\u00e7\u00e3o resultante contra as tabelas base reais.<\/p>\n<p>Em nossos projetos na JRT Technology Solutions, frequentemente encontramos sistemas onde a mesma l\u00f3gica de neg\u00f3cio \u2014 por exemplo, &#8220;clientes ativos com total de compras nos \u00faltimos 12 meses&#8221; \u2014 \u00e9 replicada em dezenas de relat\u00f3rios, procedures e aplica\u00e7\u00f5es. As <strong>Views<\/strong> eliminam essa duplica\u00e7\u00e3o: a l\u00f3gica fica centralizada em um \u00fanico objeto do banco, e qualquer mudan\u00e7a na regra de neg\u00f3cio exige altera\u00e7\u00e3o apenas na defini\u00e7\u00e3o da <strong>View<\/strong>, sem tocar no c\u00f3digo das aplica\u00e7\u00f5es consumidoras. Isso \u00e9 o que chamamos de <em>independ\u00eancia l\u00f3gica de dados<\/em> \u2014 um princ\u00edpio fundamental da arquitetura ANSI\/SPARC de tr\u00eas n\u00edveis.<\/p>\n<p>As <strong>Views<\/strong> tamb\u00e9m s\u00e3o poderosas ferramentas de seguran\u00e7a. Usando os privil\u00e9gios granulares do MySQL (<strong>GRANT SELECT<\/strong>), voc\u00ea pode dar a um usu\u00e1rio acesso apenas a uma <strong>View<\/strong> que oculta colunas sens\u00edveis como <em>salario<\/em>, <em>cpf<\/em> ou <em>hash_senha<\/em>, enquanto nega acesso direto \u00e0s tabelas base. Essa t\u00e9cnica, conhecida como <em>column masking via views<\/em>, \u00e9 amplamente utilizada em ambientes que precisam de conformidade com LGPD e PCI-DSS. Veremos exemplos pr\u00e1ticos desse padr\u00e3o ainda nesta aula.<\/p>\n<p>\u00c9 crucial entender a diferen\u00e7a entre uma <strong>View<\/strong> l\u00f3gica (a \u00fanica implementada nativamente pelo MySQL) e uma <strong>View<\/strong> materializada (presente em SGBDs como PostgreSQL e Oracle). Uma <strong>View<\/strong> materializada armazena fisicamente o resultado da consulta e requer atualiza\u00e7\u00f5es peri\u00f3dicas (<em>refresh<\/em>). No MySQL, n\u00e3o h\u00e1 suporte nativo a <strong>Views<\/strong> materializadas, mas podemos simul\u00e1-las com tabelas de resumo e eventos agendados \u2014 t\u00e9cnica que abordaremos na se\u00e7\u00e3o de dicas avan\u00e7adas.<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%; margin: 20px 0;\">\n<caption><strong>Tabela 1: Comparativo entre View L\u00f3gica (MySQL) e View Materializada (conceito)<\/strong><\/caption>\n<thead>\n<tr style=\"background-color: #f0f0f0;\">\n<th>Caracter\u00edstica<\/th>\n<th>View L\u00f3gica (MySQL nativo)<\/th>\n<th>View Materializada (simulada)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Armazenamento f\u00edsico de dados<\/td>\n<td>N\u00e3o \u2014 apenas a defini\u00e7\u00e3o SQL<\/td>\n<td>Sim \u2014 tabela f\u00edsica com o resultado<\/td>\n<\/tr>\n<tr>\n<td>Sincroniza\u00e7\u00e3o com dados base<\/td>\n<td>Sempre em tempo real (consulta as tabelas base)<\/td>\n<td>Desatualizada at\u00e9 o pr\u00f3ximo refresh<\/td>\n<\/tr>\n<tr>\n<td>Performance de leitura<\/td>\n<td>Depende da complexidade da consulta e \u00edndices das tabelas base<\/td>\n<td>Muito r\u00e1pida (leitura direta da tabela f\u00edsica)<\/td>\n<\/tr>\n<tr>\n<td>Uso de espa\u00e7o em disco<\/td>\n<td>Quase zero (apenas metadados)<\/td>\n<td>Proporcional ao volume de dados materializados<\/td>\n<\/tr>\n<tr>\n<td>Atualiza\u00e7\u00e3o via DML<\/td>\n<td>Poss\u00edvel em <strong>Views<\/strong> atualiz\u00e1veis simples<\/td>\n<td>N\u00e3o suportado \u2014 somente refresh da materializa\u00e7\u00e3o<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Criando sua primeira View \u2014 sintaxe b\u00e1sica e exemplos pr\u00e1ticos<\/h3>\n<p>O comando <strong>CREATE VIEW<\/strong> segue uma sintaxe simples, mas esconde nuances importantes que impactam diretamente a manutenibilidade e o desempenho. A forma mais b\u00e1sica \u00e9:<\/p>\n<pre><code>CREATE\n    [OR REPLACE]\n    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\n    [DEFINER = user]\n    [SQL SECURITY {DEFINER | INVOKER}]\n    VIEW nome_da_view [(lista_de_colunas)]\n    AS consulta_select;\n<\/code><\/pre>\n<p>Cada cl\u00e1usula tem um prop\u00f3sito espec\u00edfico. O <strong>OR REPLACE<\/strong> permite substituir uma <strong>View<\/strong> existente sem precisar executar <strong>DROP VIEW<\/strong> antes \u2014 extremamente \u00fatil em scripts de migra\u00e7\u00e3o e deploys automatizados, pr\u00e1tica que adotamos em todos os projetos na JRT Technology Solutions. O <strong>ALGORITHM<\/strong> controla como o MySQL processa a <strong>View<\/strong>: <strong>MERGE<\/strong> combina a cl\u00e1usula WHERE da consulta externa com a defini\u00e7\u00e3o da <strong>View<\/strong> (geralmente mais eficiente), <strong>TEMPTABLE<\/strong> cria uma tabela tempor\u00e1ria com o resultado da <strong>View<\/strong> antes de aplicar filtros externos (pode ser necess\u00e1rio para <strong>Views<\/strong> com agrega\u00e7\u00f5es), e <strong>UNDEFINED<\/strong> (padr\u00e3o) deixa o otimizador decidir. O <strong>DEFINER<\/strong> e o <strong>SQL SECURITY<\/strong> controlam com quais privil\u00e9gios a <strong>View<\/strong> ser\u00e1 executada \u2014 tema que abordaremos em detalhes na se\u00e7\u00e3o de seguran\u00e7a.<\/p>\n<p>Vamos criar nossa primeira <strong>View<\/strong>: uma lista de clientes ativos, ocultando o campo <em>email<\/em> por quest\u00f5es de privacidade. Este \u00e9 o padr\u00e3o mais simples de <em>column masking<\/em>:<\/p>\n<pre><code>-- Primeira View: clientes ativos sem expor o email\nCREATE VIEW vw_clientes_ativos AS\nSELECT\n    cliente_id,\n    nome,\n    cidade,\n    data_cadastro\nFROM clientes\nWHERE ativo = 1;\n\n-- Consultando a View como se fosse uma tabela comum\nSELECT * FROM vw_clientes_ativos;\n<\/code><\/pre>\n<pre><code class=\"output\">+------------+-----------------+----------------+---------------+\n| cliente_id | nome            | cidade         | data_cadastro |\n+------------+-----------------+----------------+---------------+\n|          1 | Ana Silva       | S\u00e3o Paulo      | 2025-01-15    |\n|          2 | Bruno Costa     | Rio de Janeiro | 2025-03-20    |\n|          4 | Daniel Oliveira | S\u00e3o Paulo      | 2025-11-05    |\n|          5 | Eduarda Lima    | Curitiba       | 2026-02-28    |\n+------------+-----------------+----------------+---------------+\n4 rows in set (0,00 sec)\n<\/code><\/pre>\n<p>Observe que a <strong>View<\/strong> funciona exatamente como uma tabela para consultas. O campo <em>email<\/em> e o campo <em>ativo<\/em> n\u00e3o aparecem no resultado \u2014 o primeiro foi omitido intencionalmente na defini\u00e7\u00e3o, e o segundo \u00e9 usado apenas como filtro interno. Um usu\u00e1rio que tiver acesso apenas a <strong>vw_clientes_ativos<\/strong> jamais ver\u00e1 os emails dos clientes, mesmo que a tabela base <strong>clientes<\/strong> os contenha.<\/p>\n<p>Para verificar a defini\u00e7\u00e3o completa de uma <strong>View<\/strong>, utilize o comando <strong>SHOW CREATE VIEW<\/strong>:<\/p>\n<pre><code>-- Exibe a defini\u00e7\u00e3o completa da View\nSHOW CREATE VIEW vw_clientes_ativos\\G\n<\/code><\/pre>\n<pre><code class=\"output\">*************************** 1. row ***************************\n                View: vw_clientes_ativos\n         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost`\nSQL SECURITY DEFINER VIEW `vw_clientes_ativos` AS\nselect `clientes`.`cliente_id` AS `cliente_id`,\n       `clientes`.`nome` AS `nome`,\n       `clientes`.`cidade` AS `cidade`,\n       `clientes`.`data_cadastro` AS `data_cadastro`\nfrom `clientes` where (`clientes`.`ativo` = 1)\ncharacter_set_client: utf8mb4\ncollation_connection: utf8mb4_0900_ai_ci\n1 row in set (0,00 sec)\n<\/code><\/pre>\n<p>Note que o MySQL expandiu os asteriscos e qualificou cada coluna com o nome da tabela. Esta \u00e9 a representa\u00e7\u00e3o can\u00f4nica que o servidor armazena internamente. O <strong>ALGORITHM=UNDEFINED<\/strong> aparece porque n\u00e3o especificamos um algoritmo \u2014 o otimizador escolheu automaticamente (provavelmente <strong>MERGE<\/strong>, dado que a consulta \u00e9 simples e sem agrega\u00e7\u00f5es).<\/p>\n<h3>Views Complexas \u2014 Joins, Subqueries e Fun\u00e7\u00f5es de Agrega\u00e7\u00e3o<\/h3>\n<p>A verdadeira pot\u00eancia das <strong>Views<\/strong> se revela quando encapsulamos consultas complexas que envolvem m\u00faltiplas tabelas, subconsultas correlacionadas e fun\u00e7\u00f5es de janela. Em ambientes de produ\u00e7\u00e3o, \u00e9 comum encontrar <strong>Views<\/strong> com 100+ linhas de SQL que consolidam dados de dezenas de tabelas para alimentar dashboards e sistemas de BI. Vamos construir uma <strong>View<\/strong> que exibe o resumo de vendas por cliente \u2014 total de pedidos, valor total comprado e ticket m\u00e9dio:<\/p>\n<pre><code>-- View complexa com joins e agrega\u00e7\u00f5es: resumo de vendas por cliente\nCREATE OR REPLACE VIEW vw_resumo_vendas AS\nSELECT\n    c.cliente_id,\n    c.nome,\n    c.cidade,\n    COUNT(DISTINCT p.pedido_id) AS total_pedidos,\n    COALESCE(SUM(ip.quantidade * ip.preco_unitario), 0) AS valor_total,\n    CASE\n        WHEN COUNT(DISTINCT p.pedido_id) > 0\n        THEN ROUND(SUM(ip.quantidade * ip.preco_unitario) \/ COUNT(DISTINCT p.pedido_id), 2)\n        ELSE 0\n    END AS ticket_medio,\n    MAX(p.data_pedido) AS ultimo_pedido,\n    DATEDIFF(CURDATE(), MAX(p.data_pedido)) AS dias_desde_ultimo_pedido\nFROM clientes c\nLEFT JOIN pedidos p ON c.cliente_id = p.cliente_id\nLEFT JOIN itens_pedido ip ON p.pedido_id = ip.pedido_id\nGROUP BY c.cliente_id, c.nome, c.cidade;\n\n-- Testando a View complexa\nSELECT * FROM vw_resumo_vendas;\n<\/code><\/pre>\n<pre><code class=\"output\">+------------+-----------------+----------------+---------------+-------------+--------------+---------------------+---------------------------+\n| cliente_id | nome            | cidade         | total_pedidos | valor_total | ticket_medio | ultimo_pedido       | dias_desde_ultimo_pedido |\n+------------+-----------------+----------------+---------------+-------------+--------------+---------------------+---------------------------+\n|          1 | Ana Silva       | S\u00e3o Paulo      |             2 | 11200.00    |      5600.00 | 2026-07-05 14:20:00 |                         3 |\n|          2 | Bruno Costa     | Rio de Janeiro |             1 |  1540.00    |      1540.00 | 2026-06-15 09:45:00 |                        23 |\n|          3 | Carla Mendes    | Belo Horizonte |             1 |  7500.00    |      7500.00 | 2026-05-20 16:10:00 |                        49 |\n|          4 | Daniel Oliveira | S\u00e3o Paulo      |             1 |  1100.00    |      1100.00 | 2026-07-01 11:00:00 |                         7 |\n|          5 | Eduarda Lima    | Curitiba       |             1 |  3440.00    |      3440.00 | 2026-07-07 08:30:00 |                         1 |\n+------------+-----------------+----------------+---------------+-------------+--------------+---------------------+---------------------------+\n5 rows in set (0,01 sec)\n<\/code><\/pre>\n<p>Esta <strong>View<\/strong> usa <strong>LEFT JOIN<\/strong> para incluir clientes sem pedidos (como Carla Mendes, que est\u00e1 inativa mas aparece com valor zero), <strong>COALESCE<\/strong> para tratar nulos, <strong>CASE<\/strong> para evitar divis\u00e3o por zero no ticket m\u00e9dio, e <strong>DATEDIFF<\/strong> com <strong>CURDATE()<\/strong> para calcular m\u00e9tricas de rec\u00eancia. Qualquer aplica\u00e7\u00e3o que consumir essa <strong>View<\/strong> receber\u00e1 dados prontos, sem precisar replicar essa l\u00f3gica complexa.<\/p>\n<p>Um detalhe crucial: <strong>Views<\/strong> que cont\u00eam <strong>GROUP BY<\/strong>, fun\u00e7\u00f5es de agrega\u00e7\u00e3o como <strong>SUM()<\/strong>, <strong>COUNT()<\/strong>, <strong>DISTINCT<\/strong> ou <strong>UNION<\/strong> s\u00e3o automaticamente <em>n\u00e3o-atualiz\u00e1veis<\/em> (read-only). Ou seja, voc\u00ea n\u00e3o pode executar <strong>INSERT<\/strong>, <strong>UPDATE<\/strong> ou <strong>DELETE<\/strong> diretamente sobre <strong>vw_resumo_vendas<\/strong>. O MySQL sinaliza isso no <em>information_schema<\/em> com a coluna <strong>IS_UPDATABLE<\/strong>. Veremos mais sobre <strong>Views<\/strong> atualiz\u00e1veis na pr\u00f3xima se\u00e7\u00e3o.<\/p>\n<h3>Views Updatable (Atualiz\u00e1veis) \u2014 Regras, Restri\u00e7\u00f5es e Armadilhas<\/h3>\n<p>Uma <strong>View<\/strong> \u00e9 considerada <em>updatable<\/em> (atualiz\u00e1vel) quando o MySQL consegue traduzir sem ambiguidade uma opera\u00e7\u00e3o DML (<strong>INSERT<\/strong>, <strong>UPDATE<\/strong> ou <strong>DELETE<\/strong>) na <strong>View<\/strong> para as tabelas base subjacentes. As regras s\u00e3o rigorosas e est\u00e3o documentadas no manual oficial. Em resumo, uma <strong>View<\/strong> \u00e9 atualiz\u00e1vel se:<\/p>\n<ol>\n<li>A consulta de defini\u00e7\u00e3o referencia <strong>exatamente uma<\/strong> tabela base (sem joins, sem subconsultas no FROM)<\/li>\n<li>N\u00e3o cont\u00e9m <strong>GROUP BY<\/strong>, <strong>HAVING<\/strong>, <strong>DISTINCT<\/strong>, <strong>UNION<\/strong> ou fun\u00e7\u00f5es de agrega\u00e7\u00e3o<\/li>\n<li>Cada coluna da <strong>View<\/strong> mapeia diretamente para uma coluna simples da tabela base (sem express\u00f5es, fun\u00e7\u00f5es ou operadores)<\/li>\n<li>A <strong>View<\/strong> inclui todas as colunas <strong>NOT NULL<\/strong> da tabela base que n\u00e3o possuem valor DEFAULT<\/li>\n<li>N\u00e3o utiliza <strong>LIMIT<\/strong> ou <strong>OFFSET<\/strong><\/li>\n<\/ol>\n<p>Vamos criar uma <strong>View<\/strong> atualiz\u00e1vel sobre a tabela <strong>produtos<\/strong> que exp\u00f5e apenas itens da categoria &#8220;Perif\u00e9ricos&#8221; e oculta a coluna <strong>estoque<\/strong> (dado estrat\u00e9gico que n\u00e3o deve ser vis\u00edvel para a equipe de vendas):<\/p>\n<pre><code>-- View atualiz\u00e1vel: apenas perif\u00e9ricos, sem coluna de estoque\nCREATE OR REPLACE VIEW vw_perifericos AS\nSELECT\n    produto_id,\n    descricao,\n    preco,\n    categoria\nFROM produtos\nWHERE categoria = 'Perif\u00e9ricos';\n\n-- Verificando se a View \u00e9 atualiz\u00e1vel\nSELECT TABLE_NAME, IS_UPDATABLE\nFROM information_schema.views\nWHERE table_schema = 'aula_views'\n  AND table_name = 'vw_perifericos';\n<\/code><\/pre>\n<pre><code class=\"output\">+-----------------+--------------+\n| TABLE_NAME      | IS_UPDATABLE |\n+-----------------+--------------+\n| vw_perifericos  | YES          |\n+-----------------+--------------+\n1 row in set (0,00 sec)\n<\/code><\/pre>\n<p>Agora vamos testar opera\u00e7\u00f5es DML nesta <strong>View<\/strong>:<\/p>\n<pre><code>-- Consulta inicial\nSELECT * FROM vw_perifericos;\n\n-- INSERT via View (a coluna 'estoque' ficar\u00e1 com valor DEFAULT 0, pois n\u00e3o est\u00e1 na View)\nINSERT INTO vw_perifericos (descricao, preco, categoria)\nVALUES ('Mousepad XL Speed', 89.90, 'Perif\u00e9ricos');\n\n-- UPDATE via View\nUPDATE vw_perifericos\nSET preco = 299.90\nWHERE descricao = 'Mouse Gamer Wireless';\n\n-- DELETE via View (cuidado!)\nDELETE FROM vw_perifericos\nWHERE descricao = 'Mousepad XL Speed';\n\n-- Verificando resultado\nSELECT * FROM vw_perifericos;\n<\/code><\/pre>\n<pre><code class=\"output\">+------------+----------------------+--------+-------------+\n| produto_id | descricao            | preco  | categoria   |\n+------------+----------------------+--------+-------------+\n|          3 | Teclado Mec\u00e2nico RGB | 450.00 | Perif\u00e9ricos |\n|          4 | Mouse Gamer Wireless  | 299.90 | Perif\u00e9ricos |\n|          5 | Webcam Full HD        | 580.00 | Perif\u00e9ricos |\n+------------+----------------------+--------+-------------+\n3 rows in set (0,00 sec)\n<\/code><\/pre>\n<p>O <strong>INSERT<\/strong> funcionou mesmo sem especificar <em>estoque<\/em> porque a coluna tem valor DEFAULT 0. Se <em>estoque<\/em> fosse <strong>NOT NULL<\/strong> sem DEFAULT, o <strong>INSERT<\/strong> teria falhado. J\u00e1 o <strong>DELETE<\/strong> removeu o registro que hav\u00edamos acabado de inserir, mas ATEN\u00c7\u00c3O: a cl\u00e1usula <strong>WHERE<\/strong> na defini\u00e7\u00e3o da <strong>View<\/strong> (<strong>categoria = &#8216;Perif\u00e9ricos&#8217;<\/strong>) N\u00c3O impede que um <strong>UPDATE<\/strong> altere a categoria para algo diferente de &#8220;Perif\u00e9ricos&#8221;. Isso faria o registro &#8220;desaparecer&#8221; da <strong>View<\/strong>? Sim, mas ele continuaria na tabela base \u2014 s\u00f3 n\u00e3o seria mais vis\u00edvel pela <strong>View<\/strong>. Esse comportamento \u00e9 sutil e causa bugs dif\u00edceis de depurar, mas felizmente o MySQL oferece uma solu\u00e7\u00e3o: a cl\u00e1usula <strong>WITH CHECK OPTION<\/strong>, que exploramos a seguir.<\/p>\n<h3>WITH CHECK OPTION \u2014 Blindando a Integridade dos Dados nas Views<\/h3>\n<p>A cl\u00e1usula <strong>WITH CHECK OPTION<\/strong> impede que opera\u00e7\u00f5es de <strong>INSERT<\/strong> ou <strong>UPDATE<\/strong> via <strong>View<\/strong> criem registros que n\u00e3o satisfa\u00e7am a condi\u00e7\u00e3o <strong>WHERE<\/strong> da pr\u00f3pria defini\u00e7\u00e3o da <strong>View<\/strong>. \u00c9 um mecanismo de integridade que atua como uma restri\u00e7\u00e3o adicional, garantindo que os dados manipulados atrav\u00e9s da <strong>View<\/strong> permane\u00e7am sempre vis\u00edveis por ela. Existem dois n\u00edveis de verifica\u00e7\u00e3o:<\/p>\n<ul>\n<li><strong>WITH CASCADED CHECK OPTION<\/strong>: verifica a condi\u00e7\u00e3o da <strong>View<\/strong> atual e de TODAS as <strong>Views<\/strong> subjacentes (comportamento padr\u00e3o se voc\u00ea omitir CASCADED\/LOCAL)<\/li>\n<li><strong>WITH LOCAL CHECK OPTION<\/strong>: verifica apenas a condi\u00e7\u00e3o da <strong>View<\/strong> atual, respeitando o <em>check option<\/em> das <strong>Views<\/strong> subjacentes apenas se elas tamb\u00e9m o tiverem definido<\/li>\n<\/ul>\n<p>Vamos reconstruir nossa <strong>View<\/strong> de perif\u00e9ricos com a prote\u00e7\u00e3o adequada:<\/p>\n<pre><code>-- Recriando a View com CHECK OPTION\nCREATE OR REPLACE VIEW vw_perifericos AS\nSELECT produto_id, descricao, preco, categoria\nFROM produtos\nWHERE categoria = 'Perif\u00e9ricos'\nWITH CHECK OPTION;\n\n-- Tentando inserir um produto de outra categoria (vai falhar)\nINSERT INTO vw_perifericos (descricao, preco, categoria)\nVALUES ('Cabo HDMI 2.1', 79.90, 'Acess\u00f3rios');\n<\/code><\/pre>\n<pre><code class=\"output\">ERROR 1369 (HY000): CHECK OPTION failed 'aula_views.vw_perifericos'\n<\/code><\/pre>\n<p>Perfeito! O MySQL rejeitou o <strong>INSERT<\/strong> porque a categoria &#8220;Acess\u00f3rios&#8221; n\u00e3o satisfaz <strong>WHERE categoria = &#8216;Perif\u00e9ricos&#8217;<\/strong>. Da mesma forma, tentar atualizar um produto existente para uma categoria diferente tamb\u00e9m falhar\u00e1:<\/p>\n<pre><code>-- Tentando alterar um perif\u00e9rico para outra categoria\nUPDATE vw_perifericos\nSET categoria = 'Acess\u00f3rios'\nWHERE descricao = 'Teclado Mec\u00e2nico RGB';\n<\/code><\/pre>\n<pre><code class=\"output\">ERROR 1369 (HY000): CHECK OPTION failed 'aula_views.vw_perifericos'\n<\/code><\/pre>\n<p>Agora, vamos demonstrar a diferen\u00e7a entre <strong>CASCADED<\/strong> e <strong>LOCAL<\/strong> com um exemplo mais elaborado, envolvendo <strong>Views<\/strong> aninhadas:<\/p>\n<pre><code>-- View base: produtos com pre\u00e7o acima de 100\nCREATE OR REPLACE VIEW vw_produtos_caros AS\nSELECT produto_id, descricao, preco, categoria\nFROM produtos\nWHERE preco > 100;\n\n-- View aninhada: somente perif\u00e9ricos da View de produtos caros\n-- Usando LOCAL CHECK OPTION\nCREATE OR REPLACE VIEW vw_perifericos_caros_local AS\nSELECT produto_id, descricao, preco, categoria\nFROM vw_produtos_caros\nWHERE categoria = 'Perif\u00e9ricos'\nWITH LOCAL CHECK OPTION;\n\n-- View aninhada com CASCADED CHECK OPTION\nCREATE OR REPLACE VIEW vw_perifericos_caros_cascaded AS\nSELECT produto_id, descricao, preco, categoria\nFROM vw_produtos_caros\nWHERE categoria = 'Perif\u00e9ricos'\nWITH CASCADED CHECK OPTION;\n\n-- Teste: INSERT com pre\u00e7o abaixo de 100\nINSERT INTO vw_perifericos_caros_local (descricao, preco, categoria)\nVALUES ('Teclado Membrana Simples', 49.90, 'Perif\u00e9ricos');\n<\/code><\/pre>\n<pre><code class=\"output\">Query OK, 1 row affected (0,01 sec)   -- Explica\u00e7\u00e3o abaixo\n<\/code><\/pre>\n<p>O <strong>INSERT<\/strong> na <strong>View<\/strong> com <strong>LOCAL CHECK OPTION<\/strong> foi bem-sucedido! Por qu\u00ea? Porque <strong>LOCAL<\/strong> verifica apenas a condi\u00e7\u00e3o da <strong>View<\/strong> onde a cl\u00e1usula foi definida (<strong>categoria = &#8216;Perif\u00e9ricos&#8217;<\/strong>). Como a <strong>View<\/strong> subjacente <strong>vw_produtos_caros<\/strong> N\u00c3O foi criada com <strong>WITH CHECK OPTION<\/strong>, a condi\u00e7\u00e3o <strong>preco > 100<\/strong> n\u00e3o \u00e9 verificada em cascata. O registro foi inserido na tabela base <strong>produtos<\/strong> com pre\u00e7o 49.90, mas desapareceu de <strong>vw_perifericos_caros_local<\/strong> porque n\u00e3o atende ao filtro da <strong>View<\/strong> pai. J\u00e1 com <strong>CASCADED<\/strong>, o mesmo <strong>INSERT<\/strong> seria rejeitado:<\/p>\n<pre><code>-- Testando com CASCADED\nINSERT INTO vw_perifericos_caros_cascaded (descricao, preco, categoria)\nVALUES ('Teclado Membrana Simples v2', 49.90, 'Perif\u00e9ricos');\n<\/code><\/pre>\n<pre><code class=\"output\">ERROR 1369 (HY000): CHECK OPTION failed 'aula_views.vw_perifericos_caros_cascaded'\n<\/code><\/pre>\n<p>Em nossos projetos na JRT Technology Solutions, padronizamos o uso de <strong>WITH CASCADED CHECK OPTION<\/strong> como padr\u00e3o de seguran\u00e7a, a menos que haja uma raz\u00e3o muito espec\u00edfica para comportamento <strong>LOCAL<\/strong>. O <strong>CASCADED<\/strong> \u00e9 mais restritivo e evita surpresas \u2014 exatamente o que queremos em sistemas cr\u00edticos.<\/p>\n<h3>Gerenciando Views \u2014 ALTER, DROP, RENAME e Consultas ao Dicion\u00e1rio de Dados<\/h3>\n<p>O ciclo de vida de uma <strong>View<\/strong> n\u00e3o termina na cria\u00e7\u00e3o. Em ambientes reais, <strong>Views<\/strong> s\u00e3o alteradas, renomeadas e eventualmente removidas. O MySQL oferece comandos espec\u00edficos para cada opera\u00e7\u00e3o, al\u00e9m de tabelas de metadados para auditoria e documenta\u00e7\u00e3o. Vamos explorar cada opera\u00e7\u00e3o com exemplos pr\u00e1ticos.<\/p>\n<p>Para <strong>alterar<\/strong> uma <strong>View<\/strong> existente, voc\u00ea tem duas op\u00e7\u00f5es: <strong>CREATE OR REPLACE VIEW<\/strong> (recomendado) ou <strong>ALTER VIEW<\/strong>. A diferen\u00e7a \u00e9 sutil: <strong>ALTER VIEW<\/strong> s\u00f3 funciona se a <strong>View<\/strong> j\u00e1 existir, enquanto <strong>CREATE OR REPLACE<\/strong> cria se n\u00e3o existir e substitui se existir \u2014 ideal para scripts de deploy idempotentes:<\/p>\n<pre><code>-- Alterando a View para incluir a coluna 'estoque' (antes omitida)\nALTER VIEW vw_perifericos AS\nSELECT produto_id, descricao, preco, estoque, categoria\nFROM produtos\nWHERE categoria = 'Perif\u00e9ricos'\nWITH CHECK OPTION;\n\n-- Verificando a nova estrutura\nDESC vw_perifericos;\n<\/code><\/pre>\n<pre><code class=\"output\">+------------+--------------+------+-----+---------+-------+\n| Field      | Type         | Null | Key | Default | Extra |\n+------------+--------------+------+-----+---------+-------+\n| produto_id | int          | NO   |     | 0       |       |\n| descricao  | varchar(200) | NO   |     | NULL    |       |\n| preco      | decimal(10,2)| NO   |     | NULL    |       |\n| estoque    | int          | NO   |     | 0       |       |\n| categoria  | varchar(50)  | YES  |     | NULL    |       |\n+------------+--------------+------+-----+---------+-------+\n5 rows in set (0,00 sec)\n<\/code><\/pre>\n<p>Para <strong>renomear<\/strong> uma <strong>View<\/strong>, utiliza-se o comando <strong>RENAME TABLE<\/strong> \u2014 sim, o mesmo usado para tabelas, pois internamente <strong>Views<\/strong> e tabelas compartilham o mesmo namespace:<\/p>\n<pre><code>-- Renomeando a View\nRENAME TABLE vw_perifericos TO vw_perifericos_disponiveis;\n\n-- Confirmando a renomea\u00e7\u00e3o\nSHOW FULL TABLES IN aula_views WHERE TABLE_TYPE LIKE 'VIEW';\n<\/code><\/pre>\n<pre><code class=\"output\">+------------------------------------+------------+\n| Tables_in_aula_views               | Table_type |\n+------------------------------------+------------+\n| vw_clientes_ativos                 | VIEW       |\n| vw_perifericos_caros_cascaded      | VIEW       |\n| vw_perifericos_caros_local         | VIEW       |\n| vw_perifericos_disponiveis         | VIEW       |\n| vw_produtos_caros                  | VIEW       |\n| vw_resumo_vendas                   | VIEW       |\n+------------------------------------+------------+\n6 rows in set (0,00 sec)\n<\/code><\/pre>\n<p>Para <strong>excluir<\/strong> uma <strong>View<\/strong>, use <strong>DROP VIEW<\/strong> com a op\u00e7\u00e3o <strong>IF EXISTS<\/strong> para evitar erros em scripts:<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%; margin: 20px 0;\">\n<caption><strong>Tabela 2: Comandos de Gerenciamento de Views no MySQL<\/strong><\/caption>\n<thead>\n<tr style=\"background-color: #f0f0f0;\">\n<th>Comando<\/th>\n<th>Fun\u00e7\u00e3o<\/th>\n<th>Exemplo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>CREATE VIEW<\/strong><\/td>\n<td>Cria uma nova View (falha se j\u00e1 existir)<\/td>\n<td><code>CREATE VIEW v AS SELECT ...<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>CREATE OR REPLACE VIEW<\/strong><\/td>\n<td>Cria ou substitui uma View existente<\/td>\n<td><code>CREATE OR REPLACE VIEW v AS ...<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>ALTER VIEW<\/strong><\/td>\n<td>Modifica uma View existente (deve existir)<\/td>\n<td><code>ALTER VIEW v AS ...<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>DROP VIEW [IF EXISTS]<\/strong><\/td>\n<td>Remove uma ou mais Views<\/td>\n<td><code>DROP VIEW IF EXISTS v1, v2;<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>RENAME TABLE<\/strong><\/td>\n<td>Renomeia uma View (compartilha namespace com tabelas)<\/td>\n<td><code>RENAME TABLE v_old TO v_new;<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>SHOW CREATE VIEW<\/strong><\/td>\n<td>Exibe a defini\u00e7\u00e3o completa da View<\/td>\n<td><code>SHOW CREATE VIEW v\\G<\/code><\/td>\n<\/tr>\n<tr>\n<td><strong>SHOW FULL TABLES<\/strong><\/td>\n<td>Lista tabelas e Views do banco<\/td>\n<td><code>SHOW FULL TABLES WHERE TABLE_TYPE='VIEW';<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>Ap\u00f3s criar diversas <strong>Views<\/strong>, \u00e9 fundamental verificar sua integridade, performance e permiss\u00f5es. Esta se\u00e7\u00e3o apresenta comandos de diagn\u00f3stico que utilizamos rotineiramente em nossos projetos na JRT Technology Solutions para garantir que o ambiente est\u00e1 saud\u00e1vel. Execute cada comando e compare com a sa\u00edda esperada.<\/p>\n<ol>\n<li><strong>Verificar todas as Views do banco e seu status de atualiza\u00e7\u00e3o:<\/strong><\/li>\n<\/ol>\n<pre><code>-- Lista todas as Views do banco com informa\u00e7\u00f5es detalhadas\nSELECT\n    TABLE_NAME AS view_name,\n    IS_UPDATABLE,\n    CHECK_OPTION,\n    DEFINER,\n    SECURITY_TYPE,\n    CHARACTER_SET_CLIENT\nFROM information_schema.views\nWHERE table_schema = 'aula_views'\nORDER BY table_name;\n<\/code><\/pre>\n<pre><code class=\"output\">+--------------------------------+--------------+--------------+----------------+---------------+----------------------+\n| view_name                      | IS_UPDATABLE | CHECK_OPTION | DEFINER        | SECURITY_TYPE | CHARACTER_SET_CLIENT |\n+--------------------------------+--------------+--------------+----------------+---------------+----------------------+\n| vw_clientes_ativos             | YES          | NONE         | root@localhost | DEFINER       | utf8mb4              |\n| vw_perifericos_caros_cascaded  | NO           | CASCADED     | root@localhost | DEFINER       | utf8mb4              |\n| vw_perifericos_caros_local     | NO           | LOCAL        | root@localhost | DEFINER       | utf8mb4              |\n| vw_perifericos_disponiveis     | YES          | CASCADED     | root@localhost | DEFINER       | utf8mb4              |\n| vw_produtos_caros              | YES          | NONE         | root@localhost | DEFINER       | utf8mb4              |\n| vw_resumo_vendas               | NO           | NONE         | root@localhost | DEFINER       | utf8mb4              |\n+--------------------------------+--------------+--------------+----------------+---------------+----------------------+\n6 rows in set (0,00 sec)\n<\/code><\/pre>\n<ol start=\"2\">\n<li><strong>Verificar o plano de execu\u00e7\u00e3o de uma View complexa:<\/strong><\/li>\n<\/ol>\n<pre><code>-- Analisando como o MySQL executa a View de resumo de vendas\nEXPLAIN SELECT * FROM vw_resumo_vendas WHERE cidade = 'S\u00e3o Paulo';\n<\/code><\/pre>\n<pre><code class=\"output\">+----+-------------+-------+------------+------+--------------------------------+-----------------------------+---------+----------------------+------+----------+---------------------------------+\n| id | select_type | table | partitions | type | possible_keys                  | key                         | key_len | ref                  | rows | filtered | Extra                           |\n+----+-------------+-------+------------+------+--------------------------------+-----------------------------+---------+----------------------+------+----------+---------------------------------+\n|  1 | SIMPLE      | c     | NULL       | ALL  | NULL                           | NULL                        | NULL    | NULL                 |    5 |    20.00 | Using where; Using temporary    |\n|  1 | SIMPLE      | p     | NULL       | ref  | fk_pedidos_clientes            | fk_pedidos_clientes         | 4       | aula_views.c.cliente_id|    1 |   100.00 | NULL                            |\n|  1 | SIMPLE      | ip    | NULL       | ref  | fk_itens_pedido_pedido_id     | fk_itens_pedido_pedido_id  | 4       | aula_views.p.pedido_id |    1 |   100.00 | NULL                            |\n+----+-------------+-------+------------+------+--------------------------------+-----------------------------+---------+----------------------+------+----------+---------------------------------+\n3 rows in set, 1 warning (0,00 sec)\n<\/code><\/pre>\n<p>Este <strong>EXPLAIN<\/strong> revela que a consulta est\u00e1 usando \u00edndices nas chaves estrangeiras (<strong>fk_pedidos_clientes<\/strong> e <strong>fk_itens_pedido_pedido_id<\/strong>), o que \u00e9 bom. No entanto, a coluna <strong>cidade<\/strong> n\u00e3o possui \u00edndice, resultando em um <em>full table scan<\/em> na tabela <strong>clientes<\/strong> (type ALL). Se sua <strong>View<\/strong> for frequentemente consultada com filtro por cidade, criar um \u00edndice <strong>CREATE INDEX idx_cidade ON clientes(cidade)<\/strong> melhorar\u00e1 drasticamente a performance.<\/p>\n<ol start=\"3\">\n<li><strong>Testar acesso a Views por usu\u00e1rio sem privil\u00e9gios diretos nas tabelas base:<\/strong><\/li>\n<\/ol>\n<pre><code>-- Cri<\/p>\n<div style=\"margin:52px 0 40px;padding:36px 28px;background:linear-gradient(135deg,#0f172a 0%,#1a2744 100%);border:2px solid #25D366;border-radius:18px;text-align:center;box-shadow:0 4px 28px rgba(37,211,102,0.18)\">\n<p style=\"margin:0 0 10px;font-size:18px;color:#ffffff;font-weight:700;line-height:1.4\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 28px;font-size:15px;color:#94a3b8;font-weight:400;line-height:1.6\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de MySQL para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1!%20Tenho%20interesse%20no%20treinamento%20de%20MySQL.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:700;padding:15px 32px;border-radius:100px;text-decoration:none;box-shadow:0 4px 16px rgba(37,211,102,0.45);letter-spacing:0.01em\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/><\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!<\/p>\n","protected":false},"author":1,"featured_media":1437,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"iawp_total_views":1,"footnotes":""},"categories":[75],"tags":[1743,2373,120,1160,2372,2374],"class_list":["post-1438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-banco-de-dados","tag-gerenciamento-de-views","tag-mysql","tag-sql-avancado","tag-views-em-mysql","tag-visoes-de-dados"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Thiago Paes Rodrigues\"\/>\n\t<meta name=\"google-site-verification\" content=\"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_BR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta property=\"og:description\" content=\"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"100\" \/>\n\t\t<meta property=\"og:image:height\" content=\"75\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-08T20:48:44+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-08T20:48:44+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61590814880509\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#blogposting\",\"name\":\"Aula 15: Views \\u2014 criando e gerenciando vis\\u00f5es de dados - BLOG - JRT Technology Solutions\",\"headline\":\"Aula 15: Views \\u2014 criando e gerenciando vis\\u00f5es de dados\",\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/ai-image-1783543712471.jpg\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 15: Views \\u2014 criando e gerenciando vis\\u00f5es de dados\"},\"datePublished\":\"2026-07-08T17:48:44-03:00\",\"dateModified\":\"2026-07-08T17:48:44-03:00\",\"inLanguage\":\"pt-BR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#webpage\"},\"articleSection\":\"DevOps, banco de dados, gerenciamento de views, MySQL, SQL avan\\u00e7ado, views em MySQL, vis\\u00f5es de dados\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#listItem\",\"name\":\"Aula 15: Views \\u2014 criando e gerenciando vis\\u00f5es de dados\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#listItem\",\"position\":3,\"name\":\"Aula 15: Views \\u2014 criando e gerenciando vis\\u00f5es de dados\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"telephone\":\"+552138277513\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-logo-mini.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#organizationLogo\",\"width\":100,\"height\":75},\"image\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61590814880509\",\"https:\\\/\\\/www.instagram.com\\\/jrtx.tech\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/\",\"name\":\"Thiago Paes Rodrigues\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#authorImage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/cropped-foto-rascunho3-96x96.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Thiago Paes Rodrigues\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#webpage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/\",\"name\":\"Aula 15: Views \\u2014 criando e gerenciando vis\\u00f5es de dados - BLOG - JRT Technology Solutions\",\"description\":\"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\\u00f5es de dados e potencialize suas consultas! Clique e descubra!\",\"inLanguage\":\"pt-BR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/ai-image-1783543712471.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#mainImage\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 15: Views \\u2014 criando e gerenciando vis\\u00f5es de dados\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/08\\\/aula-15-views-criando-e-gerenciando-visoes-de-dados\\\/#mainImage\"},\"datePublished\":\"2026-07-08T17:48:44-03:00\",\"dateModified\":\"2026-07-08T17:48:44-03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"alternateName\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"inLanguage\":\"pt-BR\",\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados - BLOG - JRT Technology Solutions","description":"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!","canonical_url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#blogposting","name":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados - BLOG - JRT Technology Solutions","headline":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados","author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/07\/ai-image-1783543712471.jpg","width":1440,"height":1024,"caption":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados"},"datePublished":"2026-07-08T17:48:44-03:00","dateModified":"2026-07-08T17:48:44-03:00","inLanguage":"pt-BR","mainEntityOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#webpage"},"isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#webpage"},"articleSection":"DevOps, banco de dados, gerenciamento de views, MySQL, SQL avan\u00e7ado, views em MySQL, vis\u00f5es de dados"},{"@type":"BreadcrumbList","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","position":1,"name":"Home","item":"https:\/\/jrtx.com.br\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","position":2,"name":"DevOps","item":"https:\/\/jrtx.com.br\/blog\/category\/devops\/","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#listItem","name":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados"},"previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#listItem","position":3,"name":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados","previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}}]},{"@type":"Organization","@id":"https:\/\/jrtx.com.br\/blog\/#organization","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","url":"https:\/\/jrtx.com.br\/blog\/","telephone":"+552138277513","logo":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#organizationLogo","width":100,"height":75},"image":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61590814880509","https:\/\/www.instagram.com\/jrtx.tech\/"]},{"@type":"Person","@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author","url":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/","name":"Thiago Paes Rodrigues","image":{"@type":"ImageObject","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#authorImage","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/cropped-foto-rascunho3-96x96.jpeg","width":96,"height":96,"caption":"Thiago Paes Rodrigues"}},{"@type":"WebPage","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#webpage","url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/","name":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados - BLOG - JRT Technology Solutions","description":"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!","inLanguage":"pt-BR","isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#breadcrumblist"},"author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"creator":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/07\/ai-image-1783543712471.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#mainImage","width":1440,"height":1024,"caption":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados"},"primaryImageOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/#mainImage"},"datePublished":"2026-07-08T17:48:44-03:00","dateModified":"2026-07-08T17:48:44-03:00"},{"@type":"WebSite","@id":"https:\/\/jrtx.com.br\/blog\/#website","url":"https:\/\/jrtx.com.br\/blog\/","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","alternateName":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","inLanguage":"pt-BR","publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"}}]},"og:locale":"pt_BR","og:site_name":"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","og:type":"article","og:title":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados - BLOG - JRT Technology Solutions","og:description":"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!","og:url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/","og:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:secure_url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:width":100,"og:image:height":75,"article:published_time":"2026-07-08T20:48:44+00:00","article:modified_time":"2026-07-08T20:48:44+00:00","article:publisher":"https:\/\/www.facebook.com\/profile.php?id=61590814880509","twitter:card":"summary_large_image","twitter:title":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados - BLOG - JRT Technology Solutions","twitter:description":"Aprenda a criar e gerenciar views no MySQL com nossa Aula 15. Domine vis\u00f5es de dados e potencialize suas consultas! Clique e descubra!","twitter:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg"},"aioseo_meta_data":{"post_id":"1438","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-07-08 20:50:17","updated":"2026-07-08 20:50:17","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\/category\/devops\/\" title=\"DevOps\">DevOps<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/jrtx.com.br\/blog"},{"label":"DevOps","link":"https:\/\/jrtx.com.br\/blog\/category\/devops\/"},{"label":"Aula 15: Views \u2014 criando e gerenciando vis\u00f5es de dados","link":"https:\/\/jrtx.com.br\/blog\/2026\/07\/08\/aula-15-views-criando-e-gerenciando-visoes-de-dados\/"}],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1438","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1438"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1438\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/1437"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}