文章目录

  • 视图
  • ①语法
  • ②检查选项(cascaded)
  • 1). CASCADED级联
  • 2). LOCAL
  • ③视图的更新
  • ④视图的作用


视图

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

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

在这里使用我本地创建的一个test数据库中的student表,使用的可视化工具是Datagrip。

表中数据如下:

mysql视图为什么自动加括号了_数据

①语法

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

2)查询
查看创建视图语句:SHOW CREATE VIEW 视图名称; 查看视图数据:SELECT * FROM 视图名称 ...... ;

3)修改

方式一:CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH[ CASCADED | LOCAL ] CHECK OPTION ] 注:创建视图的时候or replace可以不加,修改视图的时候要加。

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

4)删除
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...

执行示例:

-- 创建视图
create or replace view stu_v_1 as select id,name from student where id <= 10;

在创建视图后,可以在Datagrip的左边导航栏中看到多了个view文件夹,里面存放的是刚刚创建的视图:

mysql视图为什么自动加括号了_mysql视图为什么自动加括号了_02

-- 查询视图
show create view stu_v_1;
select * from stu_v_1;
select * from stu_v_1 where id < 3;

上述三条语句的执行结果如下:

mysql视图为什么自动加括号了_mysql视图为什么自动加括号了_03


mysql视图为什么自动加括号了_sql_04


mysql视图为什么自动加括号了_sql_05

-- 修改视图
create or replace view stu_v_1 as select id,name,no from student where id <= 10;
alter view stu_v_1 as select id,name from student where id <= 10;

执行完第一条语句之后,可以看到左边导航栏中视图结构中列的变化:

mysql视图为什么自动加括号了_mysql_06


再执行第二条语句:

mysql视图为什么自动加括号了_mysql_07

-- 删除视图
drop view if exists stu_v_1;

删除视图后,可以看到左侧导航栏中的视图也消失了:

mysql视图为什么自动加括号了_数据_08

②检查选项(cascaded)

执行语句create or replace view stu_v_1 as select id,name from student where id <= 10 ;,再执行语句select * from stu_v_1;后的查询结果:

mysql视图为什么自动加括号了_sql_09


然后,再执行语句insert into stu_v_1 values(6,'Tom');执行成功,因为视图是虚表,所以这条数据实际上是插入到student表中去了,打开student表,可以看到:

mysql视图为什么自动加括号了_mysql视图为什么自动加括号了_10


打开视图:

mysql视图为什么自动加括号了_sql_11


再执行语句insert into stu_v_1 values(30,'Tom22');可以看到基表student中多了一条记录:

mysql视图为什么自动加括号了_mysql_12


但是查询视图的时候发现,视图中的数据仍然没有变:

mysql视图为什么自动加括号了_mysql_13


这是因为我们在创建视图的时候,指定的条件为 id<=10, id为30的数据,是不符合条件的,所以没有查询出来,但是这条数据确实是已经成功的插入到了基表中。

如果我们定义视图时,如果指定了条件,然后我们在插入、修改、删除数据时,是否可以做到必须满足条件才能操作,否则不能够操作呢? 答案是可以的,这就需要借助于视图的检查选项了。

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。

执行语句create or replace view stu_v_1 as select id,name from student where id <= 10 with cascaded check option ;后再执行语句insert into stu_v_1 values(6,'Tom');发现是可以插入成功的:

mysql视图为什么自动加括号了_mysql_14


mysql视图为什么自动加括号了_数据_15


但是在执行insert into stu_v_1 values(30,'Tom22');语句时会报错,阻止了这条数据的插入。因为这条语句的条件和创建视图时指定的条件是违背的。

mysql视图为什么自动加括号了_sql_16


MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: CASCADED 和 LOCAL,默认值为 CASCADED 。

1). CASCADED级联

比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1,就相当于在v1这个视图后面也加上了with cascade option。如图所示:

mysql视图为什么自动加括号了_数据库_17

2). LOCAL

本地。

比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创建时未指定检查选项。 则在执行检查时,只会检查v2,不会检查v2的关联视图v1。

③视图的更新

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:
A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
B. DISTINCT
C. GROUP BY
D. HAVING
E. UNION 或者 UNION ALL

例如:若执行语句create view stu_v_count as select count(*) from student; 后,上述的视图中,就只有一个单行单列的数据,如果我们对这个视图进行更新或插入的操作,将会报错。如图所示:

mysql视图为什么自动加括号了_mysql视图为什么自动加括号了_18

④视图的作用

1). 简单
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

2). 安全
数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。(比如只想让某个用户看见某些特定字段的信息,看不见别的信息)

3). 数据独立
视图可帮助用户屏蔽真实表结构变化带来的影响。(比如在基表中改了字段的名字,但是视图中不会收到影响,可以另取名)