CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}] VIEW 视图名 [(属性清单)] AS SELECT 语句 [WITH [CASCADED|LOCAL] CHECK OPTION]; ALGORITHM表示视图选择的算法(可选参数) UNDEFINED:MySQL将自动选择所要使用的算法 MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分 TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句 视图名表示要创建的视图的名称 属性清单表示视图中的列名,默认与SELECT查询结果中的列名相同(可选参数) WITH CHECK OPTION表示更新视图时要保证在该试图的筛选条件范围之内(可选参数)即:用于阻止通过视图更新或插入不满足视图筛选条件的记录。
当使用WITH CHECK OPTION
子句中未显式指定关键字,MySQL默认使用CASCADED规则。
(补充详细说明)
CASCADED:更新视图时要满足检查语句所在视图以及其依赖的视图的条件(即对视图的数据修改时,要检查当前及所依赖的视图(视图可以依赖另一个视图)是否存在此语句,该语句所在视图及上一个 视图的筛选条件。满足才能修改。
LOCAL:更新视图时,只要满足该语句所在视图定义的条件即可,但如果其依赖的视图中有CASCADED,也需同时遵守上一个规则。(即要修改只要满足当前视图的条件。)
(补充LOCAL/CASCADED)
视图的记录都保存在information_schema数据库中的一个叫views的表中
1.视图使用时,以表的方式使用
视图修改
alter view 视图名 as select ...;
查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW(查看视图必须要有SHOW VIEW权限)
DESCRIBE 视图名
SHOW TABLE STATUS LIKE 'stu_class'
SHOW CREATE VIEW stu_class
1.1创建视图:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
-- 创建视图 CREATE VIEW stu_class(id,NAME,glass) AS SELECT student.`stuno`,student.`stuname`,stuinfo.`class` FROM student ,stuinfo WHERE student.`stuno`=stuinfo.`stuno`
2.视图的好处:
通过id取模存放四个表中,然后通过视图把表合成一张表;
3.视图和表的关系:
视图是表的投影,表修改了会影响视图的数据,但是视图修改不一定影响表:
a.当视图和表数据是一一对应的,才会相互影响。比如修改数据;能修改才会相互影响(如果是修改视图中的通过表数据计算得到的数据会修改失败)
b.视图插入数据时,保证视图和表数据对应外,视图还需要包含表中没有默认值的列,因为会相互影响会在表中插入数据,而没有默认值的列,必须在视图中给出其对应的值。
4.视图的算法(相当于视图的类型)
4.1 merge和temptable实际查询对象也是不一样的一个针对原表,一个是临时表:
5.MYSQL中通过CREATE OR REPLACE VIEW 语句和ALTER语句来修改视图
ALTER OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
CREATE OR REPLACE VIEW `stu_class` AS SELECT `student`.`stuno` AS `id` FROM (`student` JOIN `stuinfo`) WHERE (`student`.`stuno` = `stuinfo`.`stuno`)
ALTER语句修改视图:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
ALTER VIEW stu_class AS SELECT stuno FROM student;
删除视图使用DROP VIEW语法
DROP VIEW [IF EXISTS] view_name [, view_name] ... [RESTRICT | CASCADE]
DROP VIEW能够删除1个或多个视图。必须在每个视图上拥有DROP权限
可以使用关键字IF EXISTS来防止因不存在的视图而出错
当视图中包含如下内容的时候,视图的更新操作不被执行
(1)视图中关联了基表中被定义为非空的列(因为视图没有这个字段,不能给其赋值)(这条不怎么理解)
(2)定义视图的SELECT语句后的字段列表中使用了数学表达式
(3)定义视图的SELECT语句后的字段列表中使用聚合函数
(4)定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句