常用视图语句
-- 创建视图
CREATE VIEW t1_view AS SELECT * FROM t1;
CREATE VIEW v AS VALUES ROW(1,2);-- 查询视图
SELECT * FROM t1_view;-- 查询视图的相关系统视图
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v';-- 删除视图
DROP VIEW v1,v2;
DROP VIEW IF EXISTS v3,v4;-- 修改视图
ALTER VIEW t1_view AS select * from xxxx;
关于视图
- MySQL :: MySQL 8.0 Reference Manual :: 15.1.23 CREATE VIEW Statement
- MySQL :: MySQL 8.0 Reference Manual :: 10.2.2.4 Optimizing Derived Tables, View References, and Common Table Expressionswith Merging or Materialization
视图是从一个或多个表导出的虚拟的表。本质上,视图是一个存储好的查询,用户通过访问这个视图来获取该视图定义的数据。
视图的优势
- 把经常使用的数据定义为视图以简化SQL操作。数据库的查询大多要使用聚合函数,同时还要显示其它字段的信息,可能还会需要关联到其它表,这时涉及的 SQL 语句可能比较复杂。如果需要频繁执行此查询,就可以通过创建视图简化查询操作,之后只需要执行 SELECT * FROM view_name 就可以获得预期结果。
- 视图限制用户查询和修改可视的数据范围,提高了数据的安全性。视图是动态的数据集合,数据随着基表的更新而更新。但是视图是虚拟的,物理上是不存在的,只是存储了数据的集合,所以可以将基表中重要的字段信息屏蔽,不通过视图展示给用户。
- 视图拥有逻辑上的独立性,屏蔽了真实表的结构带来的影响。视图可以使应用程序和数据库的表在一定程度上互相独立。如果没有视图,应用一定是建立在表上的。创建了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
视图的特点
- 与表不同,视图没有分配存储空间。从视图引用的基表中提取或派生数据( 除了用于定义数据字典中视图的查询的存储之外,它不需要其他存储)。
- 在数据库中,基表和视图共享相同的命名空间,因此基表和视图不能具有相同的名称。
- 视图中无法存在相同名称的列,也无法创建。
- 可更新视图数据更新后,基表数据同时也会更新(通常情况),但需要注意视图数据与基表非 一 一对应,或者基表有约束或其他关联,视图数据可能更新失败。
视图限制
MySQL :: MySQL 8.0 Reference Manual :: 27.9 Restrictions on Views # 视图限制
- 视图定义在创建时被“冻结”,并且不受基础表定义的后续更改的影响。例如,如果在表上将视图定义为SELECT*,则稍后添加到基表中的新列不会成为视图的一部分,视图不会报错,但是从基表中删除列会导致查询视图中时出错。
- 视图需要 CREATE_VIEW / SELECT / DROP 权限,以下一 一对应。
-
- 创建视图。
- 对于SELECT语句中其他位置使用的列,需要 SELECT 权限。
- 对于 OR REPLACE 子句,则还必须具有该视图的DROP权限。
- 如果存在 DEFINER 子句,则所需的权限取决于用户。
- 视图列如果手动定义数量,则需要与后面的 select_statement 数量一致。
- 无法在视图上建立索引。
- 索引可用于使用在合并算法处理的视图。但是,使用 temptable 算法处理的视图无法利用其基础表上的索引(尽管可以在生成临时表期间使用索引)。
- SELECT语句不能引用系统变量或用户定义的变量。
- 在存储程序中,SELECT语句不能引用程序参数或局部变量。
- SELECT语句不能引用已准备好的语句参数。
- 定义中引用的任何表或视图都必须存在。如果在创建视图后,删除了定义引用的表或视图,则使用该视图会导致错误。要检查视图定义是否存在此类问题,可以使用 CHECK TABLE 语句。
- 定义不能引用临时表,也不能创建临时视图。