视图
本文的主要内容是掌握视图基础知识
视图
任务描述
本关任务:通过学习视图,创建一个单表视图和一个多表视图。
相关知识
为了完成本关任务,你需要掌握:
- 视图的定义;
- 创建视图;
- 操作视图;
- 删除视图。
视图的定义
视图(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 |
|