数据库中的视图

发布于:2024-11-29 ⋅ 阅读:(28) ⋅ 点赞:(0)

什么是视图

视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数
据,⽽是通过执⾏查询来动态⽣成数据。⽤户可以像操作普通表⼀样使⽤视图进⾏查询、更新和管
理。视图本⾝并不占⽤物理存储空间,它仅仅是⼀个查询的逻辑表⽰,物理上它依赖于基础表中的数
据。

创建视图

# 语法
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;

视图的优点

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

关于数据库中视图的学习和了解先学习到这里,希望这篇文章对大家有帮助,谢谢大家的阅读!!!