视图
- 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在。行和列数据来自定义视图的
查询中使用的表
,并且是在使用视图时动态生成的。- 视图只保存了查询的SQL逻辑,不保存查询结果。
- 在创建视图的时候,主要研究创建视图的这条SQL查询语句。
1、视图的语法
- 创建视图
- 语法:
# 创建语法
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
# or replace表示如果存在该名字的视图就替换到原来的视图
- 创建视图例子:
-- 创建视图
create or replace view stu_view as select id,name from student where id <= 10;
-- 如果视图中存在stu_view视图,则直接替换,没有则创建新的视图
create or replace view stu_view as select id,name,no from student where id <= 20;
- 修改视图
- 语法:
# 方式一:
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
# 方式二:
ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
- 修改视图例子:
-- 修改stu_view视图
create or replace view stu_view as select id,name,no from student where id <= 20;
-- 直接修改视图stu_view
alter view stu_view as select id,name from student where id <= 10;
- 查看视图
- 语法:
# 查看创建视图语句:
SHOW CREATE VIEW 视图名称;
# 查看视图数据:
SELECT * FROM 视图名称 ...... ;
- 查看视图例子:
# 查看视图stu_view的创建视图语句
show create view stu_view;
# 查看视图数据:
select * from stu_view;
- 删除视图
- 语法
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...
- 删除视图例子:
# 如果视图stu_view存在则删除视图
drop view if exists stu_view;
# 删除视图,如果不存在则报错
drop view stu_view;
2、通过视图进行插入数据
- 向视图插入数据的操作,实际上会操作到定义视图的
查询中使用的表
。
# 第一步首先创建一个视图
create or replace view stu_v_1 as select id,name from student where id <= 10 ;
# 第二步:查看视图的数据
select * from stu_v_1;
# 第三步:向视图插入数据(符合where条件的数据)
insert into stu_v_1 values(6,'Tom');
# 第三步:向视图插入数据(不符合where条件的数据)
insert into stu_v_1 values(17,'Tom22');
-
执行上述的SQL,我们会发现,id为6和17的数据都是可以成功插入到student表上的。
- 但是我们执行查询视图的时候,查询出来的数据,却没有id为17的记录。
- 原因:在创建视图的时候,指定的条件为 id<=10, id为17的数据,是不符合条件的,所以没有查询出来,但是这条数据确实是已经成功的插入到了基表(student表)中。
- 但是我们执行查询视图的时候,查询出来的数据,却没有id为17的记录。
-
如果在定义视图时指定了条件,然后我们在插入、修改、删除数据时,应该做到必须满足条件才能操作,否则不能够操作。
- 这需要借助于
视图的检查选项
。
- 这需要借助于
3、视图的检查选项
- 当使用with check option子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。
- MySQL允许
基于另一个视图
创建视图,它还会检查依赖视图
中的规则以保持一致性。(即检查规则会递归上去,比如v3是依赖v2视图创建的,v2是依赖v1视图创建的,v1是基于某个表查询的视图,当我们向v3视图插入数据时,检查会从v3递归到v1的,但是需不需要满足条件才能进行操作需要看with check option的选项是cascaded还是local)- 为了确定检查的范围,mysql提供了两个选项:
- CASCADED ( 默认值)
- 即with check option 等于 with cascaded check option
- LOCAL
- CASCADED ( 默认值)
- 为了确定检查的范围,mysql提供了两个选项:
cascaded(级联)
- 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查
v2的关联视图v1
。
- 当我们向v2视图插入数据时,不仅要检查v2的where条件,还要检查v1的where条件
- 比如:当向v2视图插入一条数据时,先和v2视图的where条件进行比对:
- 不符合v2视图的where条件则直接插入失败
- 符合v2视图的where条件则再与v1视图的where条件进行比对,如果也符合则插入成功,如果不符合则也插入失败。
- 比如:当向v2视图插入一条数据时,先和v2视图的where条件进行比对:
- 当我们向v3视图插入数据时,因为v3没有定义检查选项,所以不会去检查v3的where条件,然后先去检查v2的where条件,再去检查v1的where条件
- 比如:当向v3视图插入一条数据时,先和v2视图的where条件进行比对:
- 不符合v2视图的where条件则直接插入失败
- 符合v2视图的where条件则再与v1视图的where条件进行比对,如果也符合则插入成功,如果不符合则也插入失败。
- 比如:当向v3视图插入一条数据时,先和v2视图的where条件进行比对:
LOCAL(本地)
- 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创建时未指定检查选项。 则在执行检查时,只会检查v2,
不会检查v2的关联视图v1
。
- 当我们向v3视图插入数据时,因为v3没有使用检查选项,所以不会去检查v3的where条件,然后先去检查v2的where条件,因为v2使用的检查选项是local,而且v1没有定义检查选项,所以不回去检查v1的where条件
- 比如:当向v3视图插入一条数据时,先和v2视图的where条件进行比对:
- 不符合v2视图的where条件则直接插入失败。
- 符合v2视图的where条件则插入成功。
- 比如:当向v3视图插入一条数据时,先和v2视图的where条件进行比对:
4、视图的更新
- 要使视图可更新,
视图中的行与基础表中的行之间必须存在一对一的关系
。 - 如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
- DISTINCT
- GROUP BY
- HAVING
- UNION 或者 UNION ALL
5、视图的作用
- 1). 简单:视图不仅可以简化用户对数据的理解,也可以简化它们的操作。那些
被经常使用的查询
可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。 - 2). 安全:对于数据库的操作,可以对用户进行授权,通过数据库的授权来决定每一个登录的用户能够操作哪些数据库,能够看到哪些数据库,能够看到哪些表,能够操作哪些表,但不能授权到数据库特定行和特定的列上。通过
视图
用户只能查询和修改他们所能见到的数据。 - 3). 数据独立:视图可帮助用户屏蔽真实表结构变化带来的影响。(假如基表的某个字段发生了变化,那么我们可以针对视图进行一个更新操作,给修改的字段添加一个别名(和原来的一样),这样就屏蔽了基表的变化对业务的影响)。