【MySQL】视图

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

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.nameco.namesc.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.视图优点

  1. 简单性:视图可以将复杂的查询封装成⼀个简单的查询。例如,针对⼀个复杂的多表连接查询,可以创建⼀个视图,用户只需查询视图而无需了解底层的复杂逻辑。
  2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的用户表中,可以创建⼀个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
  3. 逻辑数据独立性:视图提供了⼀种逻辑数据独⽴性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦。
  4. 重命名列:视图允许用户重命名列名,以增强数据可读性。
相关推荐
就不掉头发2 小时前
Linux与数据库
linux·运维·数据库
Predestination王瀞潞2 小时前
基于 `SqlSession` 的事务手动管理机制
数据库·oracle·java-ee
李慕婉学姐2 小时前
Springboot传统文化服饰交流平台k79z52ic(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
Predestination王瀞潞2 小时前
映射文件中的四大核心 CRUD 操作标签(对应数据库的增、删、改、查操作)
数据库·oracle
IvorySQL2 小时前
PostgreSQL 技术日报 (3 月 12 日)|为什么加索引反而变慢?这招让查询快 50 倍
数据库·postgresql·开源
y = xⁿ2 小时前
【从零开始学习Redis|第五篇】Redis 常见数据类型和应用场景
数据库·redis·学习·缓存
kuntli3 小时前
索引失效的五大关键场景
mysql
DolphinDB智臾科技3 小时前
DolphinDB:技术赋能钢铁业,国产时序数据库领路数智化落地
数据库·物联网·时序数据库·dolphindb