MySQL:视图
目录
一、什么是视图
二、视图的创建和使用
三、修改数据
(1)修改真实表
(2)修改视图
四、删除视图
五、视图的优点
一、什么是视图
视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。
二、视图的创建和使用
语法:
CREATE VIEW view_name [(column_list)] AS select_statement
这里的语法就是我们创建视图的方式,但是我们为什么要使用视图呢?,我们下面来举个例子来看看我们使用视图的原因之一。
我们有四张表:学生表、班级表、课程表、成绩表,此时我们进行学生的所有成绩的查询,我们发现虽然我们可以得到查询结果,但是我们的查询代码其实是十分复杂的,如果我们想要对这个数据进行多次查询,是非常麻烦的。
因此为了防止多次写这些麻烦的代码,我们就使用了视图这种方式
但是在这里我们要注意,如果我们要查询的这些表中存在重名的列,我们要将除第一个写的列之外的列都起上别名。
此时我们就可以利用我们刚刚创建的视图,得到一个新的查询方式。此时这种查询方式,在以后的查询就会十分简单。
当然,如果我们不想要这种还要注意别的列,我们也可以在创建视图的时候直接指定各个列的名字
三、修改数据
(1)修改真实表
我们的视图是基于一个或多个基本表或其他视图的查询结果集,那么如果我们在创建完视图后,在对真实表中的数据进行修改,此时我们的视图结果是否会发生改变呢?
我们将张三的的MySQL的成绩修改为100
此时我们再来查看我们的视图结果,会发现此时的视图也会发生改变
因此,修改我们的真实表示会影响我们的视图的
(2)修改视图
在上面我们是修改真实表,会修改视图,而此时如果我们修改视图,他会影响我们的真实表吗?
我们将视图中score_id = 3的成绩修改为99
我们就会发现,修改我们的视图后,我们真实表中的成绩表id=3的成绩会变成99
因此,修改我们的视图也会影响我们的真实表。
注意:并不是所有的修改真实表就会影响视图和修改视图影响真实表
如果我们的视图存在以下这些情况我们的视图是不可更新的:
- 创建视图时使用聚合函数的视图
- 创建视图时使用 DISTINCT
- 创建视图时使用 GROUP BY 以及 HAVING 子句
- 创建视图时使用 UNION 或 UNION ALL
- 查询列表中使用子查询
- 在FROM子句中引用不可更新视图
四、删除视图
我们的删除视图很简单就只需要利用到关键字 drop
语法:
drop view view_name;
删除视图v_student_socre
此时我们在利用v_student_socre视图进行结果的查询就会失败
五、视图的优点
(1)简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑
这种优点就是我们在上述介绍的
(2)安全性:通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
而安全性,其实就是用户只能通过视图来查看数据,而我们在创建视图的时候,会将不想让用户看到的列,不放入视图当中,这样就实现数据的隐藏
例如我们还是创建上述表的视图,但是我们要隐藏每个学生的性别,我们就可以在创建视图的时候不加入这个列。
创建一个不带学生性别的视图
此时我们再查询视图结果,就不会得到每个学生的性别了,这就实现视图的安全性
(3)逻辑数据独立性:视图提供了一种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦
(4)重命名列:视图允许用户重命名列名,以增强数据可读性。
好了,今天的分享就到这里了,还请大家多多关注我们下一篇见!