目录
一、视图是什么?
视图(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只会检查当前视图的规则,而不检查依赖视图的规则。
视图的更新问题
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(SUM(), MIN(), MAX(), COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- UNION 或者 UNION ALL
这意味着,如果视图使用了聚合函数、DISTINCT、GROUP BY、HAVING 或 UNION/UNION ALL 等操作,那么就不能直接对视图进行插入、更新或删除操作。这是因为这些操作改变了数据的结构,使得视图中的行无法与基础表中的行建立一一对应的关系。
例如,如果你创建了一个视图,该视图使用了GROUP BY语句来汇总某个字段的值,那么你就不能直接更新这个视图,因为你不知道更新后的数据应该放在哪个具体的行中。同样,如果你创建了一个视图,该视图使用了UNION或UNION ALL来合并来自不同表的数据,那么你也无法直接更新这个视图,因为你不知道更新后的数据应该放在哪个具体的表中。
总的来说,只有那些没有使用上述操作的视图才能被直接更新。对于那些不能直接更新的视图,你仍然可以通过更新基础表来间接地更新视图。
4.视图删除
DROP VIEW [IF EXISTS] 视图名称;