mysql视图的学习记录
概念
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。
优点
1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。
视图操作
1)创建视图
OR REPLACE
:表示在创建视图时候会替换已有视图
ALGORITHM
:表示视图选择算法,将在文章的后面详细讲解
select_statement
:表示select语句
[WITH [CASCADED | LOCAL] CHECK OPTION]
:表示视图在更新时保证在视图的权限范围之内,详情将在后面讲解
2)查看视图
使用show create view
语句查看视图信息,比如
3)更改视图
- 方式一:
create or replace view view_name as select
语句; - 方式二:
4)更新视图数据
因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中
有下列内容之一,视图不能做DML操作:
– select子句中包含distinct
– select子句中包含组函数
– select语句中包含group by子句
– select语句中包含order by子句
– select语句中包含union 、union all等集合运算符
– where子句中包含相关子查询
– from子句中包含多个表
– 如果视图中有计算列,则不能更新
– 如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作
5)删除视图
6) 定义视图选项说明
WITH CHECK OPTION
作用:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。
利用with check option
约束限制,保证更新视图是在该视图的权限范围之内。
使用WITH CHECK OPTION
约束时,(不指定选项则默认是CASCADED)
可以使用CASCADED或者LOCAL选项指定检查的程度:
CASCADED
:检查所有的视图,会检查嵌套视图及其底层的视图
LOCAL
:只检查将要更新的视图本身,嵌套视图不检查其底层的视图
ALGORITHM选项
选择在处理定义视图的select语句中使用的方法
– UNDEFINED:MySQL将自动选择所要使用的算法
– MERGE:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分
– TEMPTABLE:将视图的结果存入临时表,然后使用临时表执行语句
缺省ALGORITHM选项等同于ALGORITHM = UNDEFINED
DEFINER选项
指出谁是视图的创建者或定义者
– definer= ‘用户名’@’登录主机’
– 如果不指定该选项,则创建视图的用户就是定义者,指定关键字CURRENT_USER(当前用户)和不指定该选项效果相同
SQL SECURITY选项
要查询一个视图,首先必须要具有对视图的select权限,如果同一个用户对于视图所访问的表没有select权限,那会怎么样?
SQL SECURITY选项决定执行的结果:
– SQL SECURITY DEFINER:定义(创建)视图的用户必须对视图所访问的表具有select权限,也就是说将来其他用户访问表的时候以定义者的身份,此时其他用户并没有访问权限。
– SQL SECURITY INVOKER:访问视图的用户必须对视图所访问的表具有select权限。
缺省SQL SECURITY选项等同于SQL SECURITY DEFINER
视图权限总结:
使用root用户定义一个视图(推荐使用第一种):u1、u2
1)u1作为定义者定义一个视图,u1对基表有select权限,u2对视图有访问权限:u2是以定义者的身份访问可以查询到基表的内容;
2)u1作为定义者定义一个视图,u1对基表没有select权限,u2对视图有访问权限,u2对基表有select权限:u2访问视图的时候是以调用者的身份,此时调用者是u2,可以查询到基表的内容。
总结
参考博客:https://www.cnblogs.com/ljxt/p/11613167.html
告诫自己:养成写文档的好习惯,特别记录一下学习,担心过一段时间忘了,特此记录巩固一下知识点。