mysql视图
视图:view,是一种有结构(有行有列)但没有结果(结构中不真实存放数据)的虚拟表,虚拟表的结构来源不是自己定义的,而是从对应的基表中产生(视图的数据来源)
创建视图:
基本语法:create view 视图名字 as select 语句;可以使普通查询、可以使连接查询、可以是联合查询、可以是子查询
创建单标视图:基表只有一个
create view my_v1 as
select * from my_student;
create view my_v2 as
select * from my_class;
创建多表视图:基表来源至少两个(视图中不能有重名字段)
create view my_v3 as
select s.*,c.c_name,c.room from my_student as s left join my_class c on s.c_id = c.id;
查看视图结构:
视图是一张虚拟表,表的所有查看方式都适用于视图
show tables[like]/desc 视图名字
show create tablel 视图名
视图与表有一个关键字区别,视图view,表tables,查看视图创建语句可以使用view关键字
查看视图创建语句
show vreate view my_v3;
视图一旦创建:系统会在视图对应的数据库文件夹下创建一个对应的结构文件:frm文件
查询视图内容:
select * from 视图名
修改视图
视图本身不可修改,但是视图来源是可以修改的。
alter view 视图名字 新的select语句
alter view my_v1 as
select * from my_student;
删除视图
drop view 视图名字
视图意义
1、视图可以节省sql语句,将一条复杂的查询语句使用视图进行保存 ,以后可以直接对视图操作
2、数据安全:视图操作主要针对查询,如果对视图结构进行处理,不会影响基表数据(相对安全)
3、视图往往在大项目中使用,而且是多系统使用:可以对外提供有用的数据,但是隐藏关键(无用)的数据,数据安全
4、视图可以对外提供友好性,不同的数据提供不同的数据,对外好像专门设计
5、视图可以更好地进行权限控制
视图数据操作
视图的确可以进行数据写操作,但是有很过限制
将数据直接在视图上操作
新增数据:
直接对视图进行数据新增
1、多表数据不能进行新增数据
2、可以向单表视图插入数据,但是视图中包含的字段必须事基表中所有不能为空(或者没有默认值)字段。
3、视图是可以向基表插入数据的
删除数据:
1.多表视图不能删除视图,单表视图可以删除
更新数据
无论单表视图还是多表都可以更新
update my_v3 set c_id=4 where id =5;
更新限制:with check option,如果对视图在新增的时候限定了某个字段有限制,那么在对视图进行更新时,系统会进行验证,要保证更新后视图依然
create view my_v4 as
select * from my_student where age >30 with check option;
-- 表示视图的数据来源都是年龄大于30岁:where age>30决定
-- with check option :决定通过视图更新的时候,不能将已经得到的数据age>30的改成小与30的
-- 可以修改数据让数据可以查到:可以改,但是无效果,只能操作你能看到的数据
update my_v4 set age = 32 where id =6;
视图算法
系统对视图以及外部查询视图的select语句的一种解析方式
视图算法分为3中
undefined:为定义(默认的),这不是一种实际使用算法,是一种推卸责任的算法:告诉系统,视图没有定义算法,系统自己选
temptable:临时表算法:系统先执行select语句,后执行外部查询语句
merge:合并算法:系统应该先将视图对应的select语句与外部视图查询的select语句进行合并,然后执行(效率高:常态)
算法指定:在创建视图时指定
--指定算法为临时表
create algorithm=temptable view my_v6 as
select * from my_student group by id;
视图算法选择:如果视图的select语句中会包含一个查询子句(五子句),而且很可能书序比外部的查询语句要靠后,一定要使用算法temptable,其他情况可以不用指定(默认即可)