视图:view 是一种有行有列的结构,但是没有结果的虚拟表;虚拟表的结构来源不是自己定义,而是从对应的基表中产生;
创建视图
create view 视图名字 as select 语句; -- 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.number,c.room from my_student_1 s left join my_class c on s.c_id=c.id;
查看视图
查看视图 show tables [like '匹配模式' ] 或者 desc 视图名字 ;
查看视图结构 show create table 视图名;
视图比表有一个关键字的区别:view ,查看视图的创建语句还可以使用view关键字show create view 视图名;
视图一旦创建,系统会在视图对应数据库文件夹下创建一个对应的结构文件.frm文件;
使用视图:主要是为了查询,将视图当作表一样查询即可;
select * from my_v3;
视图的执行:本质就是执行封装的select 语句;
修改视图:视图本身不可以修改,但是视图的来源是可以修改的;
alter view 视图名字 as 新的select语句;
删除视图:drop view 视图名字;
视图的意义:1.视图可以节省SQL语句,将一条复杂的语句使用视图进行保存,以后可以直接对视图进行操作;
2.数据安全:视图操作主要是针对查询的,如果对视图结构进行处理,不会影响基表数据(相对安全);
3.视图往往是在大项目中使用,而且是多系统中使用;可以对外提供有效数据,但是隐藏无用数据,数据安全; 4.视图可以提供友好型;
5.视图可以更好地进行权限控制;
视图数据操作:视图可以进行数据写操作,但是有很多限制;
新增数据:直接对视图进行新增数据,1.多表视图不能新增数据;2.可以向单表视图插入数据,但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值)的字段;3.视图是可以向基表中插入数据;
删除数据:多表视图不能删除数据;
更新数据:单表/多表视图都可以更新数据;
更新限制:with check option 如果对视图在新增的时候,限定了某个字段有限制,那么在对视图进行数据更新操作时,系统会验证;要保证更新之后,数据依然可以被查询出来,否则不让更新;
create view my_v2 as select * from my_student where age>30 with check option;
//with check option决定通过视图更新的时候不能让已得到的数据>30的更新成<30的;
视图算法:
系统对视图以及外部查询视图的select 语句的一种解析方式;
视图算法分为三种,undefined未定义的(默认的),这不是一种实际使用的算法,是一种推卸责任的算法,告诉系统视图没有定义算法;
temptable 临时表算法,系统应该先执行视图的select 语句,后执行外部查询语句;
merge合并算法 系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高,常态);
算法指定:在创建视图的时候;create algorithm=指定算法 view 视图名字 as select语句;
视图算法的选择:如果视图的select语句中包含一个查询语句(where,group by, order by,having, limit),而且很有可能顺序比外部查询语句靠后,此时使用算法temptable算法,其他情况不用指定;