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,其他情况可以使用默认即可.