这篇文章讲的是数据库中的视图,如有错误或不当之处,还望各位大神批评指正。
什么是视图?
视图(View)是从一个或多个表(或视图)导出的表。视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。——来自百度百科
视图的作用
- 简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
- 安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以
- 逻辑数据独立性。视图可帮助用户屏蔽真实表结构变化带来的影响。
数据说明
有五个表:学生表,老师表,课程表,学院表,课程成绩表。
表结构
初始数据
- 学生表
- 老师表
- 课程表
- 学院表
- 课程成绩表
创建视图CREATE VIEW
创建视图student_score_view ,要求包含学生id,姓名,课程名,分数(简单视图:不带组函数)
create view std_score_view
as
select s.s_id , s_name , c_name , score
from t_grade g join t_student s on g.s_id = s.s_id
join t_course c on c.c_id = g.c_id
创建完成:
创建课程的平均分包括,课程id,课程名,平均分(复杂视图:含有组函数的视图)
create or replace view score_avg_view
as select c.c_id , c_name , avg(score) avg_score
from t_grade g join t_course c on c.c_id = g.c_id
group by c.c_id , c_name ;
创建完成:
对视图的操作
将‘叶清逸’同学的‘java语言’的成绩修改为85(update)
update std_score_view
set score = 85
where s_name = '叶清逸' and c_name = 'java语言' ;
修改结果:
同时在t_grade表中该成绩也被修改
将‘叶清逸’同学的‘java语言’的成绩删除(delete)
delete from std_score_view
where s_name = '叶清逸' and c_name = 'java语言' ;
删除结果:
同时在对应基表也做出修改
修改视图删除视图中的s_id列并给视图添加只读权限
create or replace view std_score_view
as select s_name , c_name , score
from t_grade g join t_student s on g.s_id = s.s_id
join t_course c on c.c_id = g.c_id
with read only ;
此时视图只能读取不能修改,否则报错。
删除视图score_avg_view
drop view score_avg_view ;