视图
视图:view,是一种有结构(有行有列),但是没有结果的虚拟表,
虚拟表的结构来源不是 自己定义的,而是来源对 (select)对应基表中产生的。
创建视图
基表语法:
Create view 视图的名称 as select 语句
后面的跟的select语句,可以是普通的查询,也可以是连接查询,也可以是联合查询,子查询
创建单表视图:基表只有一个 创建多表视图:基表有多个(注意多表查询的结果不能有相同的两列)
查看视图
查看视图:查看视图的结构
视图是一张虚拟表,表的查看方式都适用于视图
Show tables [like ‘patter’]
Desc 视图名称
Show create table/view 视图名
使用视图
使用视图的目的为了查询:将视图当做表一样查询即可
修改视图
视图本身是不可修改的,但是可以修改视图的来源
修改视图:修改视图来源select语句
Alter view 视图的名称 as 新的select语句
删除视图
Drop view 视图的名称
视图意义
(1)视图可以节约SQL语句:将一条复杂的查询语句使用视图进行保存,以后可以直接对视图进行操作。
(2)数据安全:视图的操作主要是针对查询,可以进行增删改不过有很多限制
(3)视图往往在大项目中使用,而且是多系统使用:可以对外提供有用的数据,但是隐藏关键(无用)的数据:数据安全。
(4)视图可以对外提供友好型:不同的视图提供不同的数据,对外专门设计。
视图数据操作
视图的确可以进行数据写操作的,但是有很多限制。
新增数据
1、可以向单表视图插入数据:插入的字段,必须包含所有非空字段。(与向表中插入数据语句一样)
可以向视图插入数据,以此同时基表也插入数据了。
2、多表视图不能新增数据
删除数据
1、多表视图不能删除数据
2、单表视图可以删除数据
更新数据
理论上不管是单表视图还是多表视图,数据都是可以更新
视图的更新,会导致基本数据的更新
更新限制
With check option:视图在更新数据的时候,可以限制字段的更新,可以给定限定条件
比如员工表的工资,工资是不低于2000
视图算法
现象
找出各个部门工资最高的那个人
使用子查询实现
(1)按照工资降序
select * from emp order by sal desc;
(2)按照部门分组
select * from ( select * from emp order by sal desc) t group by t.deptno;
使用视图实现
(1)按照工资排序之后的数据放到视图中
(2)在视图基础上,按照部分分组
(3)我们发现结果不对:视图算法用了:merge合并算法
介绍
视图算法:系统对视图以及外部查询视图的select语句的一种解析方式。
视图:可以理解为子查询,2个select,第一个select:得到视图
视图算法分成3种:
Undefined:未定义(默认)这不是一种算法,是一种推卸责任的算法
告诉系统,视图没有定义算法,系统你自己看着办。
Temptable:临时表算法:先执行视图的select语句,然后在执行外部查询Select语句。
Merge:合并算法,系统在执行select语句之前,会对视图的select和外部查询视图的select语句进行合并,然后执行(效率高)
算法的指定
在创建视图的时候指定算法。
算法选择
如果视图的select语句中包含一个查询子句(order by,limit),而且很可能该 关键字 执行顺序 比外部查询语句 关键字 靠后 一定要使用使用temptable算法,其他情况下不用指定,默认即可。
执行顺序
from。。。where。。。group by。。。[select]。having。。。select。。。order by。。。limit。。。