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语句生成的虚拟表,不占用物理空间;表中的记录需要占用物理空间。建立和删除视图只影响视图本身,不影响实际的记录。建立和删除表会影响实际的记录。
联系:视图是基本表上建立的表,字段和记录都来自基本表,依赖基本表存在。一个视图可以对应一个基本表也可以对应多个表。视图是基本表的抽象,在逻辑意义上建立新关系。