
一.视图定义视图是一个虚拟表其内容由查询定义。同真实的表一样视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表基表的数据变化也会影响到视图。二.基本使用创建视图语法create view 视图名 as select语句在bash中我们看不见myview.frm,但是在mysql5.7中可以看到如下1. 为什么看不到myview.frm了在 MySQL 5.7 及更早版本中每个视图和表都会以视图名.frm的形式单独存放在数据库目录下。但从 MySQL 8.0 开始所有关于表、列、视图等结构的元数据都被统一存储在了由 InnoDB 存储引擎管理的“数据字典”表中。官方文档明确指出.frm文件已被移除其内容现在全部存储在数据字典表里。所以在/var/lib/mysql/test_db/目录下找不到myview.frm是 MySQL 8.0 的预期行为。2. 在 MySQL 8.0 中如何查看视图信息既然文件里看不到了就需要通过 SQL 命令来查询这个中央数据字典。你之前的ls方法不再适用请改用以下mysql命令行客户端里的 SQL 命令首先登录到 MySQL 命令行mysql -u root -p然后执行以下任一 SQL 语句查看视图定义方法一使用SHOW CREATE VIEW(最常用信息最清晰)这个命令会完整地显示创建myview这个视图的 SQL 语句。USE test_db; SHOW CREATE VIEW myview;方法二查询INFORMATION_SCHEMA数据库INFORMATION_SCHEMA是 MySQL 提供的一个标准化的元数据视图你可以像查普通表一样查它。-- 查看视图的定义语句 SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA test_db AND TABLE_NAME myview; -- 查看视图的创建选项 SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA test_db AND TABLE_NAME myview\G视图好处1. 降低查询复杂度提升开发效率视图可以将复杂的多表关联查询如查询某人的部门名称封装为一张“虚拟表”。开发人员或报表系统查询时无需重复编写复杂的JOIN逻辑只需SELECT * FROM user_dept_view即可显著简化了代码减少了出错几率。2. 提供逻辑数据独立性屏蔽底层变更即使底层原始表结构发生变化例如字段重命名、分表存储只要视图的定义不变上层应用程序的查询代码就无需任何修改。这大大降低了因数据库重构导致的应用代码改造成本。3. 利用查询改写与缓存提升高频访问性能虽然视图本身不存数据但数据库优化器可以对视图进行查询改写。对于高频访问且变化不频繁的聚合结果如某部门的人数统计结合物化视图或数据库内置的查询缓存可以大幅降低原始表的计算压力实现“以空间换时间”。修改了视图对基表数据有影响修改了基表对视图有影响删除视图语法drop view 视图名在MySQL5.7下看结构被删除了查不到myvie了三.视图规则和限制与表一样必须唯一命名不能出现同名视图或表名创建视图数目无限制但要考虑复杂查询创建为视图之后的性能影响视图不能添加索引也不能有关联的触发器或者默认值视图可以提高安全性必须具有足够的访问权限order by 可以用在视图中但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖视图可以和表一起使用补充一些方面命名与结构必须唯一命名不能与表或其他视图重名创建数目无限制但性能需评估视图可以与其他表/视图联合查询索引与性能视图不能建索引不能有关联的触发器或默认值包含聚合/GROUP BY/DISTINCT/UNION/子查询的视图强制使用 TEMPTABLE 算法视图嵌套超过3层会显著影响性能数据修改限制只读视图 以下情况视图不可更新包含聚合函数、DISTINCT、GROUP BY、HAVING包含 UNION / UNION ALLFROM 子查询派生表某些类型的子查询安全与权限视图可用于隐藏敏感字段安全必须拥有 SELECT 权限才能创建视图WITH CHECK OPTION 可防止插入不符合视图条件的数据ORDER BY 规则视图内的 ORDER BY 可能被外层查询覆盖如果视图内有 LIMITORDER BY 不会被覆盖维护风险底层表结构变更可能导致视图失效定期检查视图有效性INFORMATION_SCHEMA.VIEWSMySQL 与其他数据库差异MySQL 不支持物化视图、索引视图、参数化视图、视图触发器