mysql视图总结

目录

二、视图作用?

三、视图使用

1.视图创建

2.视图查询

3.视图修改

视图插入

视图的检查选项

视图的更新问题

4.视图删除


一、视图是什么?

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。


二、视图作用?

简化复杂查询:通过将复杂的查询逻辑封装到视图中,可以简化应用程序中的查询操作。
数据安全性:视图可以限制用户对底层表的访问权限,从而提供更高的数据安全性和隐私保护。
数据抽象和封装:通过视图,可以将多个表的数据抽象为一个虚拟表,简化数据模型和应用程序开发。
性能优化:视图可以预先计算和存储结果集,以提高查询性能,并避免重复执行复杂查询。


三、视图使用

1.视图创建

代码如下:

CREATE [OR REPLACE] VIEW view_name [(column_list)] AS SELECT statement [WITH [CASCADED | LOCAL] CHECK OPTION]

  • view_name 是你要创建的视图的名称。
  • column_list (可选)是你希望在视图中显示的列名列表,用逗号分隔。
  • SELECT statement 是一个标准的 SELECT 查询,用于定义视图的内容。

2.视图查询

查询视图与查询普通表非常相似,只需使用标准的 SQL SELECT 语句。

SHOW CREATE VIEW 视图名; 这个命令可以用来查看创建视图的原始SQL语句。


3.视图修改

方式一:使用`CREATE [OR REPLACE] VIEW`语句

CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH[CASCADED | LOCAL] CHECK OPTION]

这种方式首先会尝试创建一个新的视图。如果视图已经存在并且指定了`OR REPLACE`关键字,则会用新的`SELECT`语句替换现有的视图定义。`WITH[CASCADED | LOCAL] CHECK OPTION`是一个可选的部分,它允许你在插入或更新数据时检查新数据是否符合视图的条件。

方式二:使用`ALTER VIEW`语句

ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH[CASCADED | LOCAL] CHECK OPTION]

这种方式可以直接修改现有视图的定义。它与`CREATE OR REPLACE VIEW`语句的主要区别在于,`ALTER VIEW`只能用于已存在的视图,而`CREATE OR REPLACE VIEW`则可以在视图不存在的情况下创建新的视图。


视图插入

当对视图进行插入操作时,因为视图本身并不存储数据,而是基于一个或多个表或视图的查询结果。所以实际上是往基表中插入数据

但如果我们执行插入id为30的数据后,进行查询,我们却查询不到相应数据。

这就涉及到了视图的检查选项

WITH[CASCADED | LOCAL] CHECK OPTION

视图的检查选项

当使用WITH CHECK OPTION子句创建视图时,MySQL会在插入、更新或删除操作时检查每一行以确保它们符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。

为了确定检查的范围,MySQL提供了两个选项:CASCADED和LOCAL,默认值为CASCADED。

CASCADED: 如果视图是基于其他视图创建的,那么CASCADED选项会检查所有依赖视图的规则。这意味着如果一个视图依赖于另一个视图,那么在更改底层表时,MySQL不仅会检查当前视图的规则,还会检查所有依赖视图的规则。

LOCAL: LOCAL选项仅检查当前视图的规则。如果视图是基于其他视图创建的,那么在更改底层表时,MySQL只会检查当前视图的规则,而不检查依赖视图的规则。


视图的更新问题

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:

  1. 聚合函数或窗口函数(SUM(), MIN(), MAX(), COUNT()等)
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. UNION 或者 UNION ALL

这意味着,如果视图使用了聚合函数、DISTINCT、GROUP BY、HAVING 或 UNION/UNION ALL 等操作,那么就不能直接对视图进行插入、更新或删除操作。这是因为这些操作改变了数据的结构,使得视图中的行无法与基础表中的行建立一一对应的关系。

例如,如果你创建了一个视图,该视图使用了GROUP BY语句来汇总某个字段的值,那么你就不能直接更新这个视图,因为你不知道更新后的数据应该放在哪个具体的行中。同样,如果你创建了一个视图,该视图使用了UNION或UNION ALL来合并来自不同表的数据,那么你也无法直接更新这个视图,因为你不知道更新后的数据应该放在哪个具体的表中。

总的来说,只有那些没有使用上述操作的视图才能被直接更新。对于那些不能直接更新的视图,你仍然可以通过更新基础表来间接地更新视图。


4.视图删除

DROP VIEW [IF EXISTS] 视图名称;

  • 17
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花律095

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值