视图

本文的主要内容是掌握视图基础知识

视图

任务描述

本关任务:通过学习视图,创建一个单表视图和一个多表视图。

相关知识

为了完成本关任务,你需要掌握:

  1. 视图的定义;
  2. 创建视图;
  3. 操作视图;
  4. 删除视图。

视图的定义

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。通过视图,可以展现基表(用来创建视图的表)的部分数据;视图数据来自定义视图的查询表。

我们知道了视图的定义,那么,为什么要使用它呢?

因为视图有如下优点:

  • ① 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集;

  • ② 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行或列,但是通过视图就可以简单的实现;

  • ③ 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列队视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率

**** 创建视图

1
2
3
4
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

参数说明:

  • OR REPLACE:表示替换已有视图;
  • ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的): MySQL 自动选择要使用的算法 ;merge合并;temptable临时表;
  • column_list:可选参数,指定视图中各个属性的名词,默认情况下与select语句中查询的属性相同;
  • select_statement:表示select语句;
  • [WITH [CASCADED | LOCAL] CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内;cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件;local表示更新视图的时候,要满足该视图定义的一个条件即可。

示例一:

示例二:

以上两个示例可以看出,虽然两个视图的字段名不同,但是,数据是相同的,因为两个视图引用的是同一个表中的数据,并且,as后的创建视图的语句也相同。

在实际开发中,用户可以根据自己的需求,通过视图的方式,获取基本表中自己需要的数据,这样既能满足用户的需求,也不会破坏基本表原来的结构,从而保证了基本表中数据的安全性。

操作视图

视图是逻辑表,也就是说视图不是真实的表,但操作视图和操作普通表的语法是一样的。

用户可以在视图中无条件地使用select语句查询数据。但使用insertupdatedelete操作需要在创建视图时满足以下条件(满足以下条件的视图称为可更新视图):

  • from子句中只能引用有1个表(真实表或可更新视图);
  • 不能包含 withdistinctgroup byhavinglimit等子句;
  • 不能使用复合查询,即不能使用unionintersectexcept等集合操作;
  • select子句的字段列表不能包含聚合、窗口函数、集合返回函数。

我们仍使用之前示例中的数据来操作视图:

删除视图

若视图不再被需要,我们可以将其删除,且视图的删除并不影响源表中的数据。

删除视图的 SQL 如下:
DROP VIEW view_name;

示例:

编程要求

根据提示,在右侧编辑器补充代码,根据提供的表完成视图的创建,具体要求如下:

student表数据结构:

stu_id name math chinese
1 Tom 80 78
2 Jack 70 80
3 Lucy 97 95

stu_info表数据结构:

stu_id classes city
1 1633 长沙
2 1632 重庆
3 1633 成都

student表上创建视图stu_view,查询mathchinese字段并定义一个math+chinese成绩之和字段,值为两者之和;

student表和stu_info表上,创建stu_classes视图,查询出stu_id、姓名和班级,查询条件为两表中的stu_id字段相同。

测试说明

平台会对你编写的代码进行测试,预期输出会查询你创建的两个视图,具体内容请查看右侧测试集。

我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use School;

#请在此处添加实现代码
########## Begin ##########

#1.创建单表视图
create view stu_view as select math,chinese,math+chinese from student;

#2.创建多表视图
create view stu_classes as select student.stu_id,name,classes
from student,stu_info
where student.stu_id=stu_info.stu_id;

########## End ##########