视图
概述
1、一个或者多个数据表里的数据的逻辑显示,是向用户提供基表数据的另一种表现形式
2、视图是一种虚拟表,并不存储数据,占用很少的内存空间
3、视图建立在已有表的基础上,视图赖以建立的这些表称为基表,可以为多个基表
4、视图的创建和删除只影响视图本身,不影响对应的基表,但是当对视图中的数据进行增加、删除、修改操作时,数据表中的数据会相应地发生变化,反之亦然
5、向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起来的 SELECT 语句
6、优点
(1)操作简单:经常使用的查询操作定义为视图,不需要关心视图对应的数据表的结构、表与表之间的关联关系,数据表之间的业务逻辑和查询条件,只需要简单地操作视图即可,极大简化对数据库的操作
(2)减少数据冗余
(3)数据安全:MySQL可以根据权限,将用户对数据的访问限制在某些视图上,用户不需要查询数据表,可以直接通过视图获取数据表中的信息,一定程度上保障数据表中数据的安全性
(4)适应灵活多变的需求
(5)能够分解复杂的查询逻辑
7、缺点
(1)实际数据表的结构变更,需要及时对相关的视图进行相应的维护
(2)嵌套视图,维护复杂, 可读性差 ,容易变成系统潜在隐患
(3)创建视图的 SQL 查询可能对字段重命名,可能包含复杂的逻辑,增加维护成本
(4)视图过多,导致数据库维护成本问题
创建视图
1、在 CREATE VIEW 语句中嵌入子查询
CREATE [OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW 视图名称 [(字段列表)]
AS 查询语句
[WITH [CASCADED|LOCAL] CHECK OPTION]
(1)在 SQL 查询语句的基础上封装视图 VIEW,即基于 SQL 语句的结果集形成一张虚拟表
(2)在创建视图时,没有在视图名后面指定字段列表,则视图中字段列表默认和 SELECT 语句中的字段列表一致,如果 SELECT 语句中给字段取了别名,则视图中的字段名和别名相同
2、允许多表联合视图
(1)利用视图对数据进行格式化,进行输出
3、创建好一张视图之后,还可以在它的基础上继续创建视图,新视图实质是与基表存在映射,而不是与原视图映射
4、OR REPLACE:表示替换重名的视图
5、ALGORITHM
(1)UNDEFINED:默认值,由 MySQL 将选择所要使用的算法,倾向于 MERGE 而不是 TEMPTABLE,这是因为 MERGE 通常更有效,而且如果使用了临时表,视图是不可更新的
(2)MERGE:当使用视图时,把查询视图的语句和创建视图的语句合并起来,形成一条语句,最后再从基表中查询
(3)TEMPTABLE:当使用视图时,把创建视图的语句的查询结果放置到临时表中,然后再使用这个临时表进行相应的查询
6、MySQL 会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义,因为 MySQL 允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性
(1)WITH CASCADED CHECK OPTION:如果当前视图有检查选项,则插入数据要满足包括当前视图条件以及满足当前视图所依赖的视图的条件;如果当前视图没有检查选项,则插入数据要满足当时视图所依赖视图有检查选项及其依赖的视图的条件
(2)WITH LOCAL CHECK OPTION:递归的查找当前视图所依赖的视图是否有检查选项,如果有,则检查;如果没有,就不做检查
(3)WITH CHECK OPTION:如果未给定任一关键字,默认值为 CASCADED
查看视图
1、查看数据库的表对象、视图对象
SHOW TABLES;
2、查看视图的结构
DESC / DESCRIBE 视图名称;
3、查看视图的属性信息
SHOW TABLE STATUS LIKE '视图名称'\G
(1)显示数据表的存储引擎、版本、数据行数和数据大小等
(2)执行结果显示,注释 Comment 为 VIEW,说明该表为视图,其他的信息为 NULL,说明这是一个虚表
4、查看视图的详细定义信息
SHOW CREATE VIEW 视图名称;
更新视图
1、一般情况
(1)MySQL 支持使用 INSERT、UPDATE、DELETE 语句,对视图中的数据进行插入、更新和删除操作
(2)当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然
2、要使视图可更新,视图中的行和底层基本表中的行之间必须存在一对一的关系
3、不可更新的视图
(1)在定义视图时,指定 ALGORITHM=TEMPTABLE,视图将不支持 INSERT、DELETE 操作
(2)视图中不包含基表中所有被定义为非空,又未指定默认值的列,视图将不支持 INSERT 操作
(3)在定义视图 SELECT 语句中使用 JOIN 联合查询 ,视图将不支持 INSERT、DELETE 操作
(4)在定义视图 SELECT 语句后的字段列表,使用数学表达式或子查询 ,视图将不支持 INSERT,也不支持 UPDATE 使用数学表达式、子查询的字段值
(5)在定义视图 SELECT 语句后的字段列表,使用 DISTINCT、聚合函数 、GROUP BY、HAVING、UNION 等,视图将不支持 INSERT、UPDATE、DELETE
(6)在定义视图 SELECT 语句中包含子查询,而子查询中引用 FROM 后面的表,视图将不支持 INSERT、UPDATE、DELETE
(7)视图定义基于一个不可更新视图
(8)常量视图
4、虽然可以更新视图数据,但视图作为虚拟表 ,主要用于方便查询 ,不建议更新视图的数据,对视图数据的更改,都是通过对实际数据表里数据的操作来完成
修改视图
1、CREATE OR REPLACE VIEW:子句中各列的别名应和子查询中各列相对应
2、ALTER VIEW
ALTER VIEW 视图名称
AS
查询语句;
删除视图
1、只是删除视图的定义,并不会删除基表的数据
DROP VIEW IF EXISTS 视图名称;
DROP VIEW IF EXISTS 视图名称1,视图名称2,视图名称3,...;
2、基于视图 a、b 创建新视图 c,如果将视图 a 或视图 b 删除,导致视图 c 查询失败,这样的视图c需要手动删除或修改,否则影响使用
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战