文章目录
- 前言
- 1.什么是视图?
- 2.创建视图
- 3. 使用视图
- 4. 修改数据
- 4.1.注意事项
- 5. 删除视图
- 6.视图的优点
前言
前面我们学习了索引,这次我们来学习视图
1.什么是视图?
视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。
2.创建视图
语法:
create view view_name [(column_list)] as select_statement
3. 使用视图
例如:查询用户的所有信息和考试成绩
select s.student_id,s.name,cls.class_id,cls.name,c.course_id,c.name,sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
order by s.student_id;
所有有这样开发需求的程序员,都需要写这么复杂的SQL,为此我们为上面建立一个视图。
create view v_student_score as(
select s.student_id,s.name,cls.class_id,cls.name,c.course_id,c.name,sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
order by s.student_id
);
改进的语句:
create view v_student_score as(
select
s.student_id,
s.name as student_name,
cls.class_id,
cls.name as class_name,
c.course_id,
c.name as course_name,
sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
order by s.student_id
);
使用视图
select * from v_student_score;
为了解决上面出现重复列的问题,也可以在视图中指定列名
create view v_student_score_v1
(id,name,class_id,class_name,course_id,course_name,score)as(
select s.student_id,s.name,cls.class_id,cls.name,c.course_id,c.name,sc.score
from student s,class cls,course c,score sc
where s.class_id = cls.class_id
and sc.student_id = s.student_id
and sc.course_id = c.course_id
);
4. 修改数据
- 通过真实表修改数据,会影响视图
将上面的数据改为 99,并观察视图的数据
update score set score = 99 where student_id = 1 and course_id = 1;
select * from score;
select * from v_student_score order by id;
- 通过视图修改数据会影响基表
如果修改视图中的数据,会影响基表吗?
select * from v_student_score;
将上述分数改为80分
但是发生了下面的问题
那就改变视图 v_student_score_v1 的数据
update v_student_score_v1 set score where id = 1;
观察视图和基础表的数据
select * from v_student_score_v1 order by id asc;
select * from score where student_id = 1;
因此,不论更新了视图还是基础表,都会相互被影响,查询出来的数据都是最新结果
4.1.注意事项
- 修改真实表会影响视图,修改视图同样也会影响真实表
- 以下视图不可更新
- 创建视图时使用聚合函数的视图
- 创建视图时使用distinct
- 创建视图时使用GROUP BY 以及HAVING子句
- 创建视图时使用UNION或UNION ALL
- 查询列表中使用子查询
- 在FROM子句中引用不可更新视图
5. 删除视图
drop view view_name;
6.视图的优点
1.简单性: 视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。
2. 安全性: 通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
3. 逻辑数据独立性: 视图提供了一种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦
4. 重命名列: 视图允许用户重命名列名,以增强数据的可读性
完