目录:
1. 视图概述
1.1 为什么引入视图
1.2 什么是视图
1.3 视图的好处
1.4 视图的分类
2. 视图的建立和删除
3. 实验
1. 视图概述
1.1 为什么引入视图[1]
问题:假如因为某种需要,a表与b表需要进行合并起来组成一个新的表c。最后a表与b表都不会存在了。而由于原来程序中编写sql分别是基于a表与b表查询的,这就意味着需要重新编写大量的sql(改成向c表去操作数据)。
解决方案:定义两个视图名字还是原来的表名a和b。a、b视图完成从c表中取出内容。通过视图就可以做到不修改。
1.2 什么是视图[2]
视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据。数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。
1.3 视图的好处[3]
(1) 安全性。
一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。
(2) 查询性能提高。
(3) 应对复杂的查询需求。
可以进行问题分解,然后将创建多个视图获取数据。将视图联合起来就能得到需要的结果了。
(4) 灵活应对需求变更。
有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的。比如下文的问题案例。
1.4 视图的分类[4]
mysql的视图有三种类型:MERGE、TEMPTABLE、UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。
(1) MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
(2) TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。
(3) UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。
2. 视图的建立和删除[5]
mysql通过create view实现创建视图,语法:
create [algorithm={undifined|merge|temptable}] view view_name [(properties)] as select * [with [CASCADED|LOCAL] check option];
解析:
algorithm是可选参数,表示视图选择的算法,undefined表示mysql自动选择算法,merge表示将使用视图的语句与视图定义合并,使视图的定义部分取代语句的对应部分,temptable表示视图的结构保存到临时表,然后使用临时表执行语句。
view_name表示要创建的视图的名字。
properties是可选参数,指定视图中各属性的名词,默认与select中查询的相同。
select是一个完整的查询语句从某个表中查询某些满足条件的记录并导入视图中。
with check option是可选参数,表示更新视图是要保证在视图的权限范围之内。
视图的更改删除请参看实验部分。
3. 实验
(1) 创建表、插入数据
create table book( id int(10) not null auto_increment, name varchar(40) not null, author varchar(40) not null, press varchar(40) not null, price int(4), primary key (id) ); insert into book(name,author,press,price) values ("mysql_guider","xiao ming", "whu-press", "99"); insert into book(name,author,press,price) values ("python_guider","xiao ming", "whu-press", "100"); insert into book(name,author,press,price) values ("ws_guider","xiao ming", "whu-press", "101");
(2) 创建视图
create view book_view as select name, author from book;
创建成功!
(3) 查看视图
desc book_view;
(4) 使用视图进行查询
select * from book_view;
(5) 使用视图进行插入数据
insert into book_view values ("lol_guider","xiao yang");
插入成功!
select * from book_view;
select * from book;
(6) 使用视图进行更改数据
update book_view set author="xiao ma" where name="ws_guider";
更改成功!
select * from book;
(7) 更改视图
alter view book_view as select name, author, price from book with cascaded check option;
更改成功!
desc book_view;
(8) 删除视图
drop view if exists book_view;
运行成功!
参考:
[1] http://www.cnblogs.com/wangtao_20/archive/2011/02/24/1964276.html
[2] http://www.jb51.net/article/36363.htm
[3] http://www.cnblogs.com/lyhabc/p/3801527.html
[4] http://blog.51yip.com/mysql/1062.html
[5] http://www.cnblogs.com/kiwi/archive/2012/11/17/2775228.html