概念

视图是一张虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。

视图本身不存储数据,而是通过执行查询来动态生成数据,用户可以像操作普通表一样使用视图来进行查询更新与管理等操作。

视图本身也不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。

视图的创建与使用

语法:create view view_name [(column_list)] as select_statement;

当我们有一个复杂的 sql 查询时,如果每次都有这个需求,那么每次就要写相同的 sql 语句,例如:现在有四张表,如下所示,学生表,成绩表,班级表和课程表

在这里插入图片描述
现在有一个需求:查询学生的 id ,姓名,对应的班级 ,课程名字以及对应的成绩,我们自然而然会写出下面的sql 语句:

select st.student_id as id, st.name as '姓名', cl.name as '班级', c.name as '课程', sc.score as '成绩' 
from student st, class cl, course c, score sc 
where st.class_id = cl.class_id and sc.student_id = st.student_id and sc.course_id = c.course_id
order by st.student_id asc;

在这里插入图片描述
当我们每次都想获得这张表的时候,都需要写这么长的 sql 语句,为了以后能便捷地获得这张表,我们可以使用视图,通过视图来保存这次 sql 查询的结果集。

create view v_student_course_score as  (
select st.student_id as id, st.name as '姓名', cl.name as '班级', c.name as '课程', sc.score as '成绩' 
from student st, class cl, course c, score sc 
where st.class_id = cl.class_id and sc.student_id = st.student_id and sc.course_id = c.course_id
order by st.student_id asc
);

通过视图的创建,我们来查看表的数量,发现视图已经在数据库中:
在这里插入图片描述

当我们还有上面的 sql 查询需求的时候,我们直接查询视图就可以得到结果集了。

select * from v_student_course_score;

在这里插入图片描述

注意:

如果视图的创建的时候,如果select_statement 没有使用别名,并且发现有些名字是有重复的话,就会创建失败:

在这里插入图片描述
这三个的列名都是 name,视图无法区分,并且报下面的警告:

在这里插入图片描述
警告的意思是有重复的 name


所以在创建视图的时候要避免列名的重复,解决方法有两种,一种是在 select_statement 中就定义好别名,另一种就是在创建视图的时候在视图中定义别名,第一种方法在上面已经演示过,现在来演示第二种方法:

create view v_student_course_score2 (
id, 姓名, 班级,课程, 分数
)
as  (
select st.student_id, st.name, cl.name, c.name, sc.score 
from student st, class cl, course c, score sc 
where st.class_id = cl.class_id and sc.student_id = st.student_id and sc.course_id = c.course_id
order by st.student_id asc
);

注意取中文列名的时候不用加单引号

在这里插入图片描述


我们可以通过show create view view_name; 来查看视图的创建信息包括视图名,视图创建语句,视图使用的字符编码集和排列规则
在这里插入图片描述

视图的更新

一句话:在视图能更新的情况下,视图的更新会影响到基本表,基本表的更新也会影响到视图,二者是相互影响的关系。

下面是学生表,我们将学生表的黑旋风李逵改名为李逵:
在这里插入图片描述
在这里插入图片描述

现在我们来看一下视图,会发现视图的黑旋风李逵也被修改为李逵:
在这里插入图片描述


当我们修改视图,将李逵的id 修改为50:
在这里插入图片描述
我们会发现无法对视图进行修改,说明不是所有的视图都能进行修改,上面的信息说视图使用了 order by 子句,无法进行更新操作,在后面我会做个不能进行更新操作的视图的总结。

既然如此,我们新建立一个视图:
在这里插入图片描述

然后将李逵修改回黑旋风李逵。
在这里插入图片描述

看一下视图内容发现修改成功:
在这里插入图片描述

最后看一下学生表,也是成功被修改了:

在这里插入图片描述


现在来总结,什么样的视图不能被修改:

  1. 创建视图使用了聚合函数
  2. 使用了 distinct
  3. 使用了order by 以及 having
  4. 使用了合并查询union 或者 union all
  5. 使用了子查询
  6. 在创建视图的 from 子句中引用了不可更新的视图

视图的删除

语法:drop view view_name;

演示:视图 v_student_course_score 被删除成功。

在这里插入图片描述

小结

视图具有如下的优点:

  1. 简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。
  2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
  3. 逻辑数据独立性:视图提供了⼀种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦
  4. 重命名列:视图允许用户重命名列名,以增强数据可读性

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部