1、视图是从一个或多个表中导出的表,是虚拟的表。通过视图可以看到系统专门提供的数据,作用是方便用户对数据的操作。


     视图可以从存在的视图的基础上定义。数据库只存放视图的定义,不存放视图中的数据,数据存放在原来的表。使用视图查询数据时,数据库系统从原来的表中取出对应的数据。


     如果经常需要从多个表查询指定字段的数据,可以在表上建立视图,通过这个视图显示数据。如果表中修改了与视图相关的字段的名称,可以修改视图。


     MySQL视图不支持输入参数的功能。



2、视图的作用:


     使操作简单化,达到所见即所需的目的。视图可以简化对数据的操作。


     增加数据的安全性,通过视图,用户只能查询和修改指定的数据。数据库授权命令可以限制用户的操作权限,但不能限制到特定行和列上,使用视图则可以将用户的权限限制到特定的行和列上,以保证敏感信息不被没有权限的人看到。


     提高表的逻辑独立性,可以屏蔽原有表结构变化带来的影响。原有表增加列和删除未被引用的列,对视图不造成影响;如果修改了表中的列,可修改视图来解决这些列带来的影响。



3、创建视图


     create [algorithm={undefined | merge | temptable}] 


               view 视图名 [(属性清单)]


               as select 语句 [with [cascaded | local ] check option];


     algorithm是可选参数,表示视图的选择算法。undefined选项表示mysql将自动选择使用的算法;merge选项表示将使用视图的语句和视图的定义合并起来,使视图定义的某一部分取代语句的对应部分;temptable选项表示将视图的结果存入临时表,使用临时表执行语句。


     视图名是要创建的视图的名称,属性清单是可选参数,指定了视图中各个属性的名词,默认与select语句中查询的属性相同。


     select语句参数是一个完整的查询语句,表示从某个表中查出满足条件的记录,将这些记录导入视图中。


     with check option是可选参数,表示更新视图时要保证在该视图的权限范围内。


     cascaded是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数是默认值;Local表示更新视图时,要满足该视图本身的定义的条件即可。


 使用create view语句创建视图时,最好加上with check option并且加上cascaded参数,以便于在视图上派生出新视图后,更新视图需要考虑其父视图的约束条件。


     创建视图时需要有相应的权限,MySQL的user表保存了权限信息,查询语句为: select Select_priv,Create_view_priv from mysql.user where user ='用户名'

select Select_priv,Create_view_priv from mysql.user where user ='root';  //



4、在单表上创建视图


 

create view department_view1 as select * from department;  //视图是虚拟表,可以使用desc查询表结构 

 

       create view department_view2(name, function, location) as select d_name, function, address from department; 

 
algorithm=merge

      


5、查看视图


show create view语句和查询information_schema数据库下的views表等。


     describe worker_view1;  //或者是 desc worker_view1;  describe语句用于查看视图中各个字段的简单信息


     show table status like 'worker_view1';   //该语句显示视图的基本信息,但各属性值显示的是NULL,comment属性显示值是view;很少使用


     show create view worker_view1\G   //可以查看视图的详细信息,包括各个属性, with check option条件和字符编码(character_set_client)等信息


     select * from information_schema.views;  //所有的视图都是存储在information_schema数据库下的views表中


     


6、修改视图


     修改视图是指修改数据库中已存在的表的定义,当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。    


create or replace [algorithm={undefined | merge | temptable}]  

 

                 view 视图名 [(属性清单)] 

 

                 as select 语句 [with [cascaded | local ] check option];   //存在视图时对视图进行修改,不存在则创建视图 

 
algorithm=temptable
 

        

 

       alter [algorithm={undefined | merge | temptable}]  

 

                 view 视图名 [(属性清单)] 

 

                 as sele

ct 语句 [with [cascaded | local ] check option];

     alter view department_view2(department, name, sex, location) as select d_name, worker.name, worker.sex, address from department, worker where department.d_id=worker.d_id with check option;



7、更新视图


     是指通过视图来插入、更新和删除表中的数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。


create view depertment_view3(name, function, address) as select d_name, function, address from department where d_id = 1001; 

 

       update department_view3 set name ='科研部', function='新产品研发', address='3号楼5层'; 

 

       不是所有的视图都可以更新: 

 

       create view worker_view4(name, sex, total) as selct name, sex, count(name) from worker;  //包含SUM,COUNT,MAX,MIN等函数 

 

       create view worker_view5(name, sex, address) as selct name, sex, address from worker group by d_id;  //包含UNION, UNION ALL, DISTINCT, GROUP BY和HAVING等关键字 

 

       create view worker_view6 as select 'Aric' as name;  //常量视图也不能更新 

 

       create view worker_view7(name) as select (select name from worker);  //视图中的SELECT包含子查询 

 

       create view worker_view8 as select * from worker_view7;   //由不可更新的视图导出的视图 

 

       create algorithm=temptable view worker_view9 as select * from worker;    // 创建视图时,ALGORITHM为TEMPTABLE类型的视图也不能更新,系统默认临时表不能更新


     视图对应的表上存在没有默认值的列,且该列没有包含在视图里,则视图不能更新。在更新视图时,没有默认值的记录将没有值插入也不插入NULL,系统不允许


     with [cascaded | local] check option也能决定视图能否更新,更新视图时需要满足视图或表定义的条件。



8、删除视图


     删除数据库中已存在的视图,删除视图必须具有drop权限,不删除数据。


drop view [if exists] 视图名列表 [restrict | cascade];    //if exists判断视图是否存在,存在则执行 

 

       select Drop_priv from mysql.user where user = '用户名';



9、MySQL中视图和表的区别和联系


     区别:视图是按照SQL语句生成的虚拟表,不占用物理空间;表中的记录需要占用物理空间。建立和删除视图只影响视图本身,不影响实际的记录。建立和删除表会影响实际的记录。


     联系:视图是基本表上建立的表,字段和记录都来自基本表,依赖基本表存在。一个视图可以对应一个基本表也可以对应多个表。视图是基本表的抽象,在逻辑意义上建立新关系。