Mysql之进阶宝典系列-视图
一、视图是什么(what)
视图本质上是一个虚表,在数据库中不实际存在,它的所有数据来源于查询中所使用的表的数据,而且是在视图调用过程中动态生成的。视图只保存了SQL查询的逻辑,不保存SQL查询的结果。
二、视图的作用(why)
-
简化用户操作
经常使用的数据库查询语句可以被定义为视图,方便用户的操作,在定义视图时,可以根据具体功能定义视图名称,方便用户的理解。
-
数据安全
数据库层面上不能授权到特定的行和列数据上,通过视图用户只能查询和修改被容许访问的行和列的数据。
-
数据独立
视图可以屏蔽数据库真实表结构的变化。
三、视图的实现(how)
因为视图只保存SQL查询逻辑,不保存SQL查询结果的特性,对视图进行操作时,主要工作落在SQL查询语句上。
create [or replace] view 视图名称[(列名列表)] as select语句 [with[cascaded|local] check option];
drop view [if exists] 视图名称;
1.create [or replace] view 视图名称[(列名列表)] as select语句 [with[cascaded|local] check option];
2.alter view 视图名称[(列名列表)] as select语句 [with[cascaded|local] check option];
查询视图创建语句
show create view 视图名称;
查询视图中的数据
select 列表字段名称 from 视图名称 查询条件;
注意:以上视图实现语句中,**[]**里内容表示是非必填项
四、视图使用进阶
- 视图的检查选项
视图的主要是用于SQL查询语句,那么能否通过视图实现数据库中数据表数据的增加、删除和修改,答案是必须的,但是因为创建视图时指定的查询语句可能带有where查询条件,会出现数据库的表中可以实现数据的增加、删除、和修改,但是在视图中体现不出来,视图的检查选项就是可以一定程度上避免这个问题。
上面创建视图等语句中出现的with[cascaded|local] check option,即是检查选项在SQL语句的体现,使用with check option创建视图时,Mysql会去检查每个更改的行,即发生增加、删除、修改的数据行,以符合视图的定义。
需要特别注意的时,Mysql允许基于一个视图去创建另一个视图,并会检查依赖视图中的规则以保持一致性,Mysql提供两个参数来区分检查范围:cascaded和local,默认是cascaded。
-
cascaded
如下图,视图v2是基于v1构建的,但是v2设置了检查选项为cascaded,v1没有设置检查选项,在执行检查时,不仅会检查v2,还会检查v1,即子视图设置检查选项为cascaded,不管其父视图是否设置了检查选项,都会级联检查父视图。
-
local
如下图,视图v2是基于v1构建的,但是v2设置了检查选项为local,v1没有设置检查选项,在执行检查时,只会检查v2,不会检查v1,即子视图设置检查选项为local,不会级联检查父视图。
-
视图的更新
要是视图可更新,必须保证视图中的行与基础表中的行保持一对一关系,如果视图包含以下任何一项,视图即不可更新。
-
distinct
-
group by
-
having
-
union 或 union all
-
聚合函数或窗口函数(sum(),max()等)
-
create view stu_count as select count(*) from smbms_user;
上述语句得到的结果是单行和单列的,与基础表中的行没有保持一对一关系,对此视图修改时,会出错。