一、什么是视图
视图是从一个或几个基本表中根据用户的需要而做成的虚表。同真实的表一样,视图包含一系列带有名称的列和行数据。
视图只存储定义,而不存储实际的数据,视图在打开的瞬间通过定义从基表中搜集数据,并展现给用户。
视图与查询都是由sql语句组成,但是它们也有明显的区别:
1.存储上的区别,视图存储为数据库设计的一部分,而查询不是;
2.更新的限制不同;
3.通过sql语句可以对一个表进行排序,但是视图不行。
二、视图的优点
1.能分割数据,简化观点。可以通过SELECT和WHERE语句来定义视图,分割数据表中用户不关心的数据;
2.为数据提供一定的逻辑独立性。如果为某一个基表定义一个视图,即使以后基本表的内容发生改变了也不会影响“视图定义”所得到的数据;
3.提供自动的安全保护功能。视图可以像基本表一样授予或取消访问许可权;
4.视图可以间接更新数据表;
三、创建删除视图、通过视图更新源表数据
创建视图:
create [or replace] view [db_name.]view_name as select_statement [with [cascade|local] check option]
如果给定了or replace 那么当同名视图存在时将覆盖原视图,同时要对视图有删除权限。
如:create view purchase_detail as select product.name as name,product.price as price,purchase.qty as qty,product.price * purchase.qty as total_value from
product,purchase where product.id = purchase.id;
select * from purchase_detail;
修改视图:
alter view view_name as select_statement;
使用update更新视图中的数据:
1.更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列
如有如下的视图:create view detail as select id,name,department_name from employee,department where employee.dept_id=department.dept_id;
update detail set id=\'001\',department_name=\'wenda\' where id=\'01\';//这个是错误的
update detail set id=\'001\' where id=\'01\'; update detail setdepartment_name=\'wenda\' where id=\'01\';//这个是正确的
2.不能在使用了distinct语句的视图中更新值;
3.不能再group by语句的视图中更新值;
4.当视图由两个以上基表构成时,不允许删除视图的数据;
5.如果不了解视图定义内容,则常常会发生向视图中输入不符合视图定义的数据的情况,这个时候要用with check option
如,create view detail as select * from employee where sex="male";
这个时候完全可以插入insert detail values(\'001\',\'female\'),为了防止这种情况的发生,可以使用with check option子句来对插入或更改的数据进行限制;
6.若视图的字段来自集函数,则此视图不允许更新;