找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程(ಥ_ಥ)-CSDN博客
所属专栏: MYSQL
引言
前面我们学习MySQL数据库时,创建表之后,会在表中插入数据,在需要的时候,也会进行查询数据。但是我们没有考虑到一个点:在表中的某些数据可能是属于私密信息,如果也被查出来了的话,那么就算是泄露了用户的个人信息。因此我们要解决的就是如何将私密的信息隐藏起来,不会被查询到呢?这就是我们接下来要学习的知识:视图。
视图的概念
视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数
据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管
理。视图本身并不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。也就是说视图就是可以将普通表中的数据封装起来,让查询的用户看到视图中给出的数据,而不是查看普通表中的所有数据。
创建并使用视图
create view view_name [(column_list)] as select_statement;
-- select_statement 是查询普通表的查询语句
-- (column_list) 是为视图指定的列名
举例:
-- 创建视图
create view student_view as (
select id, name from student
);
-- 查询视图中的信息
select * from student_view;
-- 查询视图中的结构
desc student_view;
我们在来看看取了列名的结果是什么样的。
-- 创建视图
create view student_view2 (i,j) as (
select id, name from student
);
-- 查询视图中的信息
select * from student_view2;
-- 查询视图中的结构
desc student_view2;
注意:
1、在命名时,视图中的列名必须必须要和查询语句中的结果集列名一致。
2、在使用默认列名的情况下,查询语句中的列名不能重复。但是如果我们手动命名的情况下,就可以允许查询语句中的列名重复。
例如:在进行联合查询的时候,我们想要查询出两个表中对应的name列,但是如果此时的视图没有起列名的话(因为此时视图的列名默认是查询语句中的列决定的)就会导致视图中的列名重复而出现错误。反之,如果起了列名,那么就是以手动的为主,因此就不会报错。
3、视图是和真实表相关联的。当真实表中的数据更新之后,视图中的数据也会跟着变化。同理更新视图之后,真实表中的数据也会跟着受影响。
但使用一下查询语句则不能更新视图:
1、创建视图时使用聚合函数
2、创建视图时使用 DISTINCT
3、创建视图时使用 GROUP BY 以及 HAVING 子句
4、创建视图时使用 UNION 或 UNION ALL
5、查询列表中使用子查询
6、在FROM子句中引用不可更新视图
上述情况之所以不能更新视图,是因为它们创建视图的时候,并不是真实表。如果是使用真实表创建视图,那么视图的更新就会影响的真实表;反之,如果影响不到真实表的话,那么更新还有什么意义呢?因此MySQL便规定不能不是使用真实表创建的视图是不能够更新的。
删除视图
语法:
drop view view_name;
视图的优点
1、简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。
2、安全性:通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
3、逻辑数据独立性:视图提供了一种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。
4、重命名列:视图允许用户重命名列名,以增强数据可读性。