视图是什么
视图(View)是一种虚拟存在的表。视图中的数据,来自定义视图的查询语句中,使用的表,并且是在使用视图时动态生成的。
简单讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
为什么要使用视图(视图的作用)
1.简化查询语句
与Java等语言中的方法一样,对于重复使用到的查询语句(比如作为子查询,代表一个列或者用于WHERE的条件判断),可以将其定义成视图。这样子使用时就直接调用视图即可,项目越大,越能简化查询语句。
2.保护数据安全
表可以授权,但不能授权到 特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据,也能帮用户屏蔽真实表结构变化带来的影响 。如果你想让别人只能看到一张表中的个别字段的数据,此时就会使用到视图。
视图的基本操作
# 创建视图
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS
SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
# 查看视图的创建语句
SHOW CREATE VIEW 视图名称;
# 查询视图中的数据
SELECT 字段名 FROM 视图名称 ...;//与查询表的语句一样
# 修改视图
# 方式一:直接覆盖
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)]
AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
# 方式二:修改
ALTER VIEW 视图名称[(列名列表)]
AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
# 删除视图
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...
注意,想要使视图能够更新,视图中的行与基础表中的行之间必须存在一对一的关系。
视图包含以下任何一项,则该视图不可更新:
A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
B. DISTINCT
C. GROUP BY
D. HAVING
E. UNION 或者 UNION ALL
检查选项
当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入、更新、删除,以使其符合视图的定义。 MySQL还允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项:
CASCADED 和 LOCAL,默认值为 CASCADED 。
CASCADED:假设有两个视图为v1和v2。v2是基于v1创建的,如果v2的检查规则定义为CASCADED(或者未指定,则默认也为CASCADED)。此时,使用v2插入数据时,不仅会检查v2的检查条件,还会检查v1的检查条件
CREATE OR REPLACE VIEW v1 AS SELECT empno,ename,sal FROM emp_back WHERE sal<=2000;
CREATE OR REPLACE VIEW v2 AS SELECT empno,ename,sal FROM v1 WHERE sal>=1000
WITH CASCADED CHECK OPTION;
INSERT INTO v2 VALUES(8080,'TOM',1888);
INSERT INTO v2 VALUES(8081,'MARY',2500);
执行上述代码时,8080可以插入成功,但是8081插入不会成功。虽然8081的sal为2500,满足v2的sal>=1000,但是不满足v1的sal<=2000,所以插入不成功。
LOCAL: 执行检查时,只会检查v2,不会检查v2的关联视图v1
将之前v2的CASCADED修改为LOCAL,此时就可以发现,8081可以插入成功了,因为它不再检查v1的sal<=2000。