MySQL中的视图(View)是一个虚拟表,它不包含实际存储在数据库中的数据,而是根据查询语句动态生成的结果集。
1、mysql视图概述
1.1、视图含义
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。
1.2、视图作用
1.2.1、简单化
1.2.2、安全性
1.2.3、逻辑数据独立性
2、创建视图
视图中包含了SELECT查询结果,因此视图的创建基于SELECT语句和已存在的数据表,视图可以创建在一张表上,也可以建立在多张表上。
格式:
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH[CASCADED|LOCAL]CHECK OPTION]
CREATE:表示创建新的视图。
REPLACE:表示替换已经创建的视图。
ALGORITHM:表示视图选择的算法。
UNDEFINED:表示MYSQL将自动选择算法。
MERGE:表示将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句定义的部分。
TEMPTABLE:表示将视图的结果存入临时表,然后用临时表来执行语句。
view_name:为视图的名称。
column_list:为属性列。
SELECT_statement:表示select语句。
WITH[CASCADED|LOCAL]CHECK OPTION:表示视图在更新时保证在视图的权限范围之内。
3、查看视图
3.1、DESCRIBE语句查看视图基本信息:
DESCRIBE(DESC) 视图名;
3.2、SHOW TABLE STATUS 语句查看视图基本信息
SHOW TABLE STATUS LIKE '视图名';
3.3、SHOW CREATE VIEW 语句查看视图详细信息
SHOW CREATE VIEW 视图名
3.4、在views表中查看视图详细信息
在MYSQL中,information_schema数据库下views表中存储了所有视图的定义
SELECT * FROM information_schema.views;
4、修改视图
4.1、CREATE OR REPLACE VIEW 语句修改视图
格式:
CREATE [OR REPLACE] [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH[CASCADED|LOCAL]CHECK OPTION]
4.2、ALTER 语句修改视图
格式:
ALTER [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH[CASCADED|LOCAL]CHECK OPTION]
5、更新视图
5.1、INSERT语句
5.2、UPDATE语句
UPDATE view_name SET column_name=value;
5.3、DELETE语句
DELETE FROM view_name WHERE 条件;
5.4、当视图中包含如下内容时,视图的更新操作将不能被执行:
1)、视图中不包含基表中被定义为非空的列。
2)、在定义视图的SELECT语句中的字段列表中使用了数学表达式。
3)、在定义视图的SELECT语句中的字段列表中使用了聚合函数。
4)、在定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY或HAVING子句。
6、删除视图
DROP VIEW [IF EXISTS] view_name[,view_name]... [RESTRICT|CASCADE]
view_name:需要删除的视图名称,可以添加多个需要删除的视图名称,使用逗号分隔。
删除时必须拥有DROP权限。
7、权限管理
可以对视图设置权限,控制用户对视图的访问,而不需要直接授予对底层表的权限,增强了安全性。
8、性能影响
视图的查询可能会引入额外的性能开销,尤其是在视图定义复杂或涉及大量数据时。
优化视图设计和使用适当的索引可以减轻这种影响。
9、重写与替换
视图可以被替换(REPLACE VIEW)或修改(ALTER VIEW)其定义,以便适应数据模型或查询需求的变化。
10、事务处理
视图在事务处理中同样遵循事务的隔离级别规则,这可能会影响视图数据的一致性和可见性。
11、依赖关系
视图依赖于其引用的基本表,如果基表结构发生变化(如列名更改),可能需要相应地调整视图定义。
12、视图的优点
提高数据安全。
简化复杂的查询操作。
提供了一定程度的数据抽象和逻辑独立性。
方便数据共享,无需暴露底层表结构