( 13 )MySQL中的视图

MySQL中的视图


视图
视图:view 是一种由结构(有行有列)但是没有结果(结构中不存放数据)的虚拟表.虚拟表的结构来源不是自己定义,而是对应的基表中产生(视图的数据来源)
创建视图
基本语法:
create view 视图名字 as select 语句;
--select 语句可以是普通的查询,可以是连接查询,可以是联合查询,可以是子查询
创建单表视图 : 基表来源是一个
 
创建多表视图 
基表来源是多个(两个或者两个以上)
注意 : 视图基表有多张 , 字段名不能重复
查看视图
查看视图 : 查看视图的结构,视图是一张虚拟表,表的所有查看方式都适合视图
视图与表的区别 :
查询视图的创建语句: show create view 视图名 [ \G ];
视图一旦创建,系统就会在视图对应的数据库文件下创建一个frm文件来保存结构
使用视图
使用视图就是为了查询,就相当于表的查询
-- 视图就像一个零库存的经销商(不生产但能拿到数据)
视图的执行就是执行了封装了select语句,代码的复用
基本语法:select * from 视图名;
修改视图
视图本身不能修改,但是视图的来源是可以修改 (select语句可以修改)
基本语法:
alter view 视图名字 as 新的select 语句;
删除视图
基本语法:
drop view 视图名字 where 条件;
视图意义
1,视图可以节省SQL语句,将一条复杂的查询的语句,使用视图进行保存,以后可以直接对视图进行操作.
2,数据安全, 视图操作主要是针对查询,如果对视图结构进行处理(删除),不会影响到基表数据(相对安全).
3.视图往往是在大项目中使用,而是多系统使用.可以对外提供有用的数据,但是隐藏关键(无用)的数据,确保数据安全
4.视图可以提供友好性:不同的视图提供不同的数据,对外好像专门设计的
5.视图可以更好的权限的控制.
新增视图数据操作
视图可以进行数据的写操作,但是有很多限制,将数据直接在是视图上操作
数据的新增就是直接对视图进行视图新增
1.多表视图不能新增数据
2.单表视图可以插入数据,前提:视图中包含的字段必须包含基表中所有不能为空(或者没有默认值)的字段.
eg:视图中不包含某个字段,但是基表中有该字段.对实体操作时要是视图没有提供数据,那么基表中使用默认数据:NULL,但是基表中该字段不允许为空,所以失败.
3.视图可以向基本插入数据 条件:插入的数据在基表中允许为空.
删除视图数据操作
多表视图不能删除数据.单表视图可以删除.
基本语法:
delet from 视图名 where 条件;
更新视图数据操作
更新数据理论上单表视图,多表视图都能更新数据.
基本语法:
update 视图名 set 字段名 = 值;
更新限制: with check option, 如果对视图进行更新的时候,限定了某个字段有限制,
那么对视图进行数据更新操作是,系统会进行验证,要保证更新之后数据依然可以被视图查询出来,否则不让更新.
-- 创建视图时对字段进行了限制(更新限制)
create view 视图名 as select * from 表名 where 条件 whth check option;
--创建视图的时候加上了with check option 关键字时候,系统验证通过才能更新
--视图的数据来源有条件限制,更新的时候不能超越到限制的条件
--当不满足with check option条件时, 更新操作的语句可以执行成功但是没有效果,就是说查询视图的时候,查询不到更新的那条数据 保证要改的数据是视图中能查的出来的数据.
 
视图算法
--需求:获取所有班级中身高最高的一个学生.
create view 视图名as select * from 学生表 order by 身高 desc;
select * from 视图名 group by 班级;
-- 不正确
视图算法:系对视图以及外部查询视图的select语句的一种解析方式
视图算法分为三种:
undefined :未定义(默认的)这不是一种实际算法,是一种推卸责任的算法;就是
告诉系统没有定义算法,让系统自己选择
temptable:临时表算法.系统先执行视图select语句,后执行外部select查询语句
marge : 合并算法.系统先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高:常态),系统在undefined条件下优先选择marge.
算法指定的基本语法:
create algorithm = 指定算法 view 视图名字 as select 语句;
视图算法选择
--五子句:where ,order by ,group by ,having limit 子句.
如果视图的select 语句中包含一些查询子句(五子句),而且顺序可能比外部的查询语句要靠后,一定要使用算法temptable,其他情况可以使用默认即可.

 

posted @ 2017-10-30 16:27  -老衲-  阅读(200)  评论(0编辑  收藏  举报