数据库中的视图
- 什么是视图
- 创建视图
- 使⽤视图
- 修改数据
- 注意事项
- 删除视图
- 视图的优点
什么是视图
视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数
据,⽽是通过执⾏查询来动态⽣成数据。⽤户可以像操作普通表⼀样使⽤视图进⾏查询、更新和管
理。视图本⾝并不占⽤物理存储空间,它仅仅是⼀个查询的逻辑表⽰,物理上它依赖于基础表中的数
据。
创建视图
# 语法
CREATE VIEW view_name [(column_list)] AS select_statement
使⽤视图
• 查询⽤户的所有信息和考试成绩
# 使用真实表进行查询
select
s.student_id,s.sn,s.name,s.mail,
cla.class_id,cla.name,
c.course_id,c.name,
sc.score
from
student s,class cla,course c,score sc
where
s.student_id = sc.student_id and
cla.class_id = s.class_id and
c.course_id = sc.course_id
order by
s.student_id;
# 创建视图,在select中使用别名
create view v_student_score as(
select
s.student_id,s.sn,s.name as student_name,s.mail,
cla.class_id,cla.name as class_name,
c.course_id,c.name course_name,
sc.score
from
student s,class cla,course c,score sc
where
s.student_id = sc.student_id and
cla.class_id = s.class_id and
c.course_id = sc.course_id
order by
s.student_id
)
# 创建视图,指定结果集中的列名
create view v_student_score_v1
(student_id,sn,student_name,mail,
class_id,class_name,
course_id,course_name,
score)
as (
select
s.student_id,s.sn,s.name,s.mail,
cla.class_id,cla.name,
c.course_id,c.name,
sc.score
from
student s,class cla,course c,score sc
where
s.student_id = sc.student_id and
cla.class_id = s.class_id and
c.course_id = sc.course_id
);
select * from v_student_score;
select * from v_student_score_v1;
• 查询⽤户的姓名和总分,(隐藏学号和各科成绩)
# 查询用户的姓名和总分,(隐藏学号和各科成绩)
# 使用真实表进行查询
select
s.name,sum(sc.score) total
from
student s,score sc
where
sc.student_id = s.student_id
group by
sc.student_id
order by
sc.student_id;
# 如果使用真实表,在查询列表中随时可以加上学号字段
# 创建视图
create view v_student_total_points as (
select
s.name,sum(sc.score) total
from
student s,score sc
where
sc.student_id = s.student_id
group by
sc.student_id
order by
sc.student_id
);
# 使用视图查询,只能查到学生姓名和总分,不能再添加查询字段
select * from v_student_total_points;
• 视图和真实表进⾏表连接查询
# 视图和真实表进行表连接查询
select * from v_student_total_points v, student s where v.name = s.name;
修改数据
• 通过真实表修改数据,会影响视图
select * from v_student_score_v1 where student_name = '黑旋风李逵' and course_name = 'java';
# 修改黑旋风李逵的java成绩为99分
select * from student;
select * from course;
update score set score = 99 where student_id = 1 and course_id = 1;
# 查询视图,发现黑旋风李逵这条记录已被修改
select * from v_student_score_v1 where student_name = '黑旋风李逵' and course_name = 'java';
• 通过视图修改数据会影响基表
select * from v_student_score_v1 where student_name = '许仙' and course_name = 'java';
# 在视图中修改许仙的java成绩改为99分
update v_student_score_v1 set score = 99 where student_name = '许仙' and course_name = 'java';
select * from v_student_score_v1 where student_name = '许仙' and course_name = 'java';
# 是看真实表数据已被修改
select * from score where student_id = 4 and course_id = 1;
注意事项
- 修改真实表会影响视图,修改视图同样也会影响真实表
- 以下视图不可更新:
-
- 创建视图时使⽤聚合函数的视图
-
- 创建视图时使⽤ DISTINCT
-
- 创建视图时使⽤ GROUP BY 以及 HAVING ⼦句
-
- 创建视图时使⽤ UNION 或 UNION ALL
-
- 查询列表中使⽤⼦查询
-
- 在FROM⼦句中引⽤不可更新视图
删除视图
# 语法
drop view view_name;
drop view v_student_score_v1;
drop view v_student_total_points;
drop view v_student_score;
视图的优点
- 简单性:视图可以将复杂的查询封装成⼀个简单的查询。例如,针对⼀个复杂的多表连接查询,可以创建⼀个视图,⽤户只需查询视图⽽⽆需了解底层的复杂逻辑。
- 安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的⽤户表中,可以创建⼀个不包含密码列视图,普通⽤户只能访问这个视图,⽽不能访问原始表。
- 逻辑数据独⽴性:视图提供了⼀种逻辑数据独⽴性,即使底层表结构发⽣变化,只需修改视图定
义,⽽⽆需修改依赖视图的应⽤程序。使⽤到应⽤程序与数据库的解耦 - 重命名列:视图允许⽤户重命名列名,以增强数据可读性。
关于数据库中视图的学习和了解先学习到这里,希望这篇文章对大家有帮助,谢谢大家的阅读!!!