视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本身不存储数 据,而是通过执行查询来动态生成数据。用户可以像操作普通表⼀样使用视图进行查询、更新和管 理。视图本身并不占用物理存储空间,它仅仅是⼀个查询的逻辑表示,物理上它依赖于基础表中的数据。
1.创建视图
语法:
sql
create view view_name[(column_list)] as select_statement;
- view:创建视图关键字
- view_name:视图名
- column_list:视图中包含的列
- select_statement:视图对应的SQL语句
示例:查询学生的所有信息和考试成绩
根据题目要查询出学生id,姓名,所在班级,课程及对应的成绩。
如下图中的表,都是真实存在的表:

现在使用真实表进行查询:

像上述的查询,如果每次想要获取表中的信息,都要反复写这样复杂的查询,但是如果将这种查询封装成一个视图,就可以达到简化的效果,也就是说,创建一个视图,然后将要查询的语句封装进去,当想要查询时,直接查询创建的视图即可。
1.1 创建视图不指定列(全列查询)
创建视图,将以上的SQL定义成一个视图:
但是,当创建好视图后,出现了以下的错误,原因:在视图的 SELECT 列表中,出现了多个同名的列 name,导致数据库无法区分。

解决方法 :给重复的列名 st.name,co.name,sc.name 加上别名,让它们在视图中拥有唯一的列名。视图就能成功创建了:

当以后想要查询学生的所有信息及课程成绩时,直接查询创建好的视图就可以了,就不需要再指定列名、表等后再查询:

注意:view 和 table,即视图和表是同一级的,视图是基于表的虚拟表(不存储任何数据,只存储一条SELECT语句的定义,访问时动态计算结果),它们都是可以在某个数据库下创建的,
使用**show tables;**语句可以查出来:

1.2 创建视图指定列(指定列查询)
在上述例子中,若创建视图时SELECT列表包含重复列名且未给这些列取别名,语句会报错。这是因为在MySQL中,未手动指定视图列名(创建视图时没有指定列)时,视图的列名默认继承SELECT结果集的列名,而数据库要求视图的列名必须唯一,因此为SELECT中重复的列名添加别名即可解决该问题;
当创建视图时手动指定列名,无论SELECT结果集的列名是否唯一(是否已通过别名实现唯一),只要视图指定了列名,视图就会根据指定列名创建,SELECT结果集中列名是否重复不重要(MySQL 跳过了 SELECT 列名唯一性校验,优先使用指定的视图列名),其本质是对SELECT结果集的列进行 "重命名";也就是说,创建视图时指定列名无论SELECT结果集列名是否唯一,最终都会通过指定的视图列名调整列的最终名称。
示例:基于之前例子创建视图时,指定视图列名:select中列名唯一的情况(取别名),再通过指定视图列名对select结果集重命名:


也可以查看视图的结构,列名确实变了:

select中列名不唯一的情况(没有取别名):

示例2:查询用户的姓名和总分,(隐藏学号和各科成绩)
首先先使用真实表查询一下:

如果使用真实表,在查询列表中随时可以加上学号字段,这样根本无法实现隐藏学号和各科成绩的功能,此时就可以使用视图,对该查询进行封装,那么即使对视图采用全列查询(视图不指定列),也只能查询到学生的姓名和总分:


视图和真实表也可以进行表连接查询:

2.修改数据
示例:修改张三同学的计算机成绩为99时:

结论一 :通过真实表/基表修改数据,会影响视图

结论二 :通过视图修改数据会影响基表
通过视图将张三的计算机成绩从99改为98:

以上错误的原因:创建视图时使用了order by子句,在MySQL中,使用该子句的视图是不能进行更新操作的。因此,我们要将视图中该子句删除掉:


通过上述的两个结论,无论更新了基础表还是视图,相互都会被影响,查询出来的数据都是最新的结果。
总结
- 修改真实表会影响视图,修改视图同样也会影响真实表
- 以下视图不可更新:
- 创建视图时使用聚合函数的视图
- 创建视图时使用 DISTINCT
- 创建视图时使用 GROUP BY 以及 HAVING 子句
- 创建视图时使用 UNION 或 UNION ALL
- 查询列表中使用子查询
- 在FROM子句中引用不可更新视图
3.删除视图
语法:
sql
drop view view_name;
示例:

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