mysql概要(八)视图

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子句

posted @ 2016-01-15 21:52  假程序猿  阅读(302)  评论(0编辑  收藏  举报