Mysql(八) — 视图

Mysql(八) — 视图前面我们学习了索引 这次我们来学习视图视图是一个虚拟的表 它是基于一个或多个基本表或其他视图的查询结果集

大家好,欢迎来到IT知识分享网。


前言

前面我们学习了索引,这次我们来学习视图


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子句
    • 创建视图时使用UNIONUNION ALL
    • 查询列表中使用子查询
    • 在FROM子句中引用不可更新视图

5. 删除视图

drop view view_name; 

6.视图的优点

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



免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111809.html

(0)
上一篇 2026-01-22 15:33
下一篇 2026-01-22 16:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信