视图 (View)

image.png

1. 视图定义

视图是在一个、多个基本表或视图基础上,通过查询语句定义的虚拟表格。
image.png

2.视图的作用

image.png

3. 视图的工作机制

视图中的内容总是与基本表中数据保持一致,即当基本表中数据发生变化时,相关视图的数据也随之变化。

MySQL视图管理(MySQL View)

1.创建视图

  1. CREATE [OR REPLACE ] [ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE}]
  2. [DEFINER = { user | CURRENT_USER }](视图的创建者)
  3. VIEW 视图名[(视图字段列表)]
  4. AS 查询语句
  5. [WITH [CASCADED | LOCAL] CHECK OPTION];
  • 添加OR REPLACE可选参数表明可以在创建视图时替换数据库已有同名视图。
  • ALGORITHM表示视图的使用方法。其中,UNDEFINE表示由MySQL自行决定使用方法。
  • 当省略视图字段时,使用查询语句的字段名称作为视图的字段名称。
  • AS指明视图的定义,其后由一个完整的SELECT语句。
  • 构成WITH CHECK OPTION表示更新、修改和插入视图数据时,只有满足检查条件操作才会执行。

    视图中定义的列名,如果列名省略,列名自动取查询出来的列名,但属于下列3种情况必须写列名:

    • 某个目标列是聚集函数或表达式;
    • 多表连接中有相同的列名;
    • 在视图中为某列取新的名称更合适。

(1)在一张基本表上创建视图

  • 创建信息学院学生视图s_view

    1. CREATE VIEW s_view
    2. AS SELECT * FROM s
    3. WHERE dept='信息学院';

    (2)在多张基本表上创建视图

  • 创建学生选课情况视图s_sc_c_view,视图字段列表为学号sno、姓名sname、课程名cname及成绩score

    1. CREATE VIEW s_sc_c_view(sno, sname, cname, score)
    2. AS SELECT s.sno, sn, cn, score
    3. FROM s, c, sc
    4. WHERE s.sno = sc.sno AND sc.cno = c.cno;

    (3)在视图上创建视图

  • 在信息学院的学生视图s_view基础上,创建计算机专业学生视图s_maj_view

    1. CREATE VIEW s_maj_view
    2. AS SELECT * FROM s_view
    3. WHERE maj='计算机';

    视图创建的注意事项: 1、不能在SELECT语句中包含系统、用户变量以及处理语句参数,同时不能在FROM子句中包含子查询。 2、删除视图依赖的基本表后,视图使用会报错,可通过“CHECK TABLE 表名”检查基本表状态。 3、不能为临时表创建视图。 4、创建视图时,ALGORITHM参数指定对部分查询结果具有影响。

2. 查看视图的定义

  • DESCRIBE 视图名称;

查看视图s_view的结构信息

  1. DESCRIBE s_view;
  • SHOW CREATE VIEW 视图名称;

查看视图s_view的视图创建信息

  1. SHOW CREATE VIEW s_view;

3. 修改视图的定义

  • 使用CREATE OR REPLACE VIEW语句修改视图的定义

    使用CREATE OR REPLACE VIEW修改视图时,需要检查修改视图名称的正确性,若名称错误,则不会替换原视图,反而会按照错误名称新建视图。

  1. ALTER [ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE}]
  2. [DEFINER = { user | CURRENT_USER }]
  3. VIEW 视图名[(视图列表)]
  4. AS 查询语句
  5. [WITH [CASCADED | LOCAL] CHECK OPTION];
  • 修改s_view视图,按s_id、s_name和s_maj字段名称显示理学院学生的学号、姓名和专业

    1. ALTER VIEW s_view(s_id,s_name,s_maj)
    2. AS SELECT sno,sn,maj
    3. FROM s
    4. WHERE dept='理学院';

    4. 删除视图

    1. DROP VIEW [IF EXISTS] 视图名称1[,...] [RESTRICT | CASCADED];

    使用DROP VIEW语句可删除一个或多个已有视图。

  • 删除视图s_view

    1. DROP VIEW s_view;

    5. 更新视图的数据

  • 由于视图是一张由基本表建立的虚表,所以对视图进行数据更新操作将转换成对基本表中数据的更新操作

    注意: 视图的本质是方便查询或保护数据,因此,当对视图执行数据更新操作时,有些情况是不可能的,如视图依赖于多张基本表。

  • 构建用于更新数据的学生s_update_view,提供学生表中的所有信息

    1. CREATE VIEW s_update_view
    2. AS SELECT * FROM s;
  • 使用INSERT向视图中插入数据

    1. INSERT INTO s_update_view
    2. VALUES('s10','韩义','男',19,'计算机','信息学院');
  • 使用UPDATE修改视图中数据

    1. UPDATE s_update_view
    2. SET age = 20 WHERE sno = 's10';
  • 使用DELETE删除视图中数据

    1. DELETE FROM s_update_view
    2. WHERE sno = 's10';

    注意:

    • 视图字段列表或查询语句中包含了聚合函数。
    • 视图字段列表或查询语句是通过表达式或计算得到的。
    • 视图定义语句中包含DISTINCT关键字或GROUP BY、ORDER BY、HAVING子句。
    • 视图定义的查询语句中使用了集合查询UNION或UNION ALL。
    • 视图的列来自于查询语句中子查询的列。
    • 创建视图时ALGORITHM为TEMPTABLE类型。
    • 视图依赖于其他不可更新视图建立。