视图
本文的主要内容是掌握视图基础知识
视图
任务描述
本关任务:通过学习视图,创建一个单表视图和一个多表视图。
相关知识
为了完成本关任务,你需要掌握:
- 视图的定义;
- 创建视图;
- 操作视图;
- 删除视图。
视图的定义
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。通过视图,可以展现基表(用来创建视图的表)的部分数据;视图数据来自定义视图的查询表。
我们知道了视图的定义,那么,为什么要使用它呢?
因为视图有如下优点:
① 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集;
② 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行或列,但是通过视图就可以简单的实现;
③ 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列队视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。
**** 创建视图
1 | |
参数说明:
OR REPLACE:表示替换已有视图;ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的):MySQL自动选择要使用的算法 ;merge合并;temptable临时表;column_list:可选参数,指定视图中各个属性的名词,默认情况下与select语句中查询的属性相同;select_statement:表示select语句;[WITH [CASCADED | LOCAL] CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内;cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件;local表示更新视图的时候,要满足该视图定义的一个条件即可。
示例一:
示例二:
以上两个示例可以看出,虽然两个视图的字段名不同,但是,数据是相同的,因为两个视图引用的是同一个表中的数据,并且,as后的创建视图的语句也相同。
在实际开发中,用户可以根据自己的需求,通过视图的方式,获取基本表中自己需要的数据,这样既能满足用户的需求,也不会破坏基本表原来的结构,从而保证了基本表中数据的安全性。
操作视图
视图是逻辑表,也就是说视图不是真实的表,但操作视图和操作普通表的语法是一样的。
用户可以在视图中无条件地使用select语句查询数据。但使用insert、update和delete操作需要在创建视图时满足以下条件(满足以下条件的视图称为可更新视图):
from子句中只能引用有1个表(真实表或可更新视图);- 不能包含
with、distinct、group by、having、limit等子句; - 不能使用复合查询,即不能使用
union、intersect、except等集合操作; 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,查询math、chinese字段并定义一个math+chinese成绩之和字段,值为两者之和;
在student表和stu_info表上,创建stu_classes视图,查询出stu_id、姓名和班级,查询条件为两表中的stu_id字段相同。
测试说明
平台会对你编写的代码进行测试,预期输出会查询你创建的两个视图,具体内容请查看右侧测试集。
我的代码
1 | |