视图 (View)
1. 视图定义
视图是在一个、多个基本表或视图基础上,通过查询语句定义的虚拟表格。
2.视图的作用
3. 视图的工作机制
视图中的内容总是与基本表中数据保持一致,即当基本表中数据发生变化时,相关视图的数据也随之变化。
MySQL视图管理(MySQL View)
1.创建视图
CREATE [OR REPLACE ] [ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }](视图的创建者)
VIEW 视图名[(视图字段列表)]
AS 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
- 添加OR REPLACE可选参数表明可以在创建视图时替换数据库已有同名视图。
- ALGORITHM表示视图的使用方法。其中,UNDEFINE表示由MySQL自行决定使用方法。
- 当省略视图字段时,使用查询语句的字段名称作为视图的字段名称。
- AS指明视图的定义,其后由一个完整的SELECT语句。
- 构成WITH CHECK OPTION表示更新、修改和插入视图数据时,只有满足检查条件操作才会执行。
视图中定义的列名,如果列名省略,列名自动取查询出来的列名,但属于下列3种情况必须写列名:
- 某个目标列是聚集函数或表达式;
- 多表连接中有相同的列名;
- 在视图中为某列取新的名称更合适。
(1)在一张基本表上创建视图
创建信息学院学生视图s_view
CREATE VIEW s_view
AS SELECT * FROM s
WHERE dept='信息学院';
(2)在多张基本表上创建视图
创建学生选课情况视图s_sc_c_view,视图字段列表为学号sno、姓名sname、课程名cname及成绩score
CREATE VIEW s_sc_c_view(sno, sname, cname, score)
AS SELECT s.sno, sn, cn, score
FROM s, c, sc
WHERE s.sno = sc.sno AND sc.cno = c.cno;
(3)在视图上创建视图
在信息学院的学生视图s_view基础上,创建计算机专业学生视图s_maj_view
CREATE VIEW s_maj_view
AS SELECT * FROM s_view
WHERE maj='计算机';
视图创建的注意事项: 1、不能在SELECT语句中包含系统、用户变量以及处理语句参数,同时不能在FROM子句中包含子查询。 2、删除视图依赖的基本表后,视图使用会报错,可通过“CHECK TABLE 表名”检查基本表状态。 3、不能为临时表创建视图。 4、创建视图时,ALGORITHM参数指定对部分查询结果具有影响。
2. 查看视图的定义
- DESCRIBE 视图名称;
查看视图s_view的结构信息
DESCRIBE s_view;
- SHOW CREATE VIEW 视图名称;
查看视图s_view的视图创建信息
SHOW CREATE VIEW s_view;
3. 修改视图的定义
- 使用CREATE OR REPLACE VIEW语句修改视图的定义
使用CREATE OR REPLACE VIEW修改视图时,需要检查修改视图名称的正确性,若名称错误,则不会替换原视图,反而会按照错误名称新建视图。
ALTER [ALGORITHM={ UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
VIEW 视图名[(视图列表)]
AS 查询语句
[WITH [CASCADED | LOCAL] CHECK OPTION];
修改s_view视图,按s_id、s_name和s_maj字段名称显示理学院学生的学号、姓名和专业
ALTER VIEW s_view(s_id,s_name,s_maj)
AS SELECT sno,sn,maj
FROM s
WHERE dept='理学院';
4. 删除视图
DROP VIEW [IF EXISTS] 视图名称1[,...] [RESTRICT | CASCADED];
使用DROP VIEW语句可删除一个或多个已有视图。
删除视图s_view
DROP VIEW s_view;
5. 更新视图的数据
由于视图是一张由基本表建立的虚表,所以对视图进行数据更新操作将转换成对基本表中数据的更新操作。
注意: 视图的本质是方便查询或保护数据,因此,当对视图执行数据更新操作时,有些情况是不可能的,如视图依赖于多张基本表。
构建用于更新数据的学生s_update_view,提供学生表中的所有信息
CREATE VIEW s_update_view
AS SELECT * FROM s;
使用INSERT向视图中插入数据
INSERT INTO s_update_view
VALUES('s10','韩义','男',19,'计算机','信息学院');
使用UPDATE修改视图中数据
UPDATE s_update_view
SET age = 20 WHERE sno = 's10';
使用DELETE删除视图中数据
DELETE FROM s_update_view
WHERE sno = 's10';
注意:
- 视图字段列表或查询语句中包含了聚合函数。
- 视图字段列表或查询语句是通过表达式或计算得到的。
- 视图定义语句中包含DISTINCT关键字或GROUP BY、ORDER BY、HAVING子句。
- 视图定义的查询语句中使用了集合查询UNION或UNION ALL。
- 视图的列来自于查询语句中子查询的列。
- 创建视图时ALGORITHM为TEMPTABLE类型。
- 视图依赖于其他不可更新视图建立。