概念
1.什么是视图
数据库视图是是一种虚拟存在的表,是一个逻辑表,本身并不包含数据,它被定义为具有连接的SQL SELECT查询语句。 因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据。
2.视图的作用
使用视图的大部分情况是为了保障数据安全性,提高查询效率,主要作用如下:
(1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
(2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
(3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
二、创建视图
视图中包含了select查询的结果,因此视图的创建是基于select语句和已存在的数据表,视图可以建立在一张表上,也可以建立在多张表上。语法形式如下:
create [or replace] [algorithm = {undefined | merge | temptable}]
view [db_name.]view_name [(column_list)]
as select_statement
[with [cascaded | local] check option
1.在单表上创建视图
use study;
/*在单表上创建视图*/
create table t (quantity int,price int);
insert into t values(3,50);
create view view_t as select quantity,price,quantity*price from t;create view view_t2(qty,price,total) as select quantity,price,quantity*price from t;
2.在多表上创建视图mysql也可以在两个或两个以上的表上创建视图。
在student表和stu_info表上创建视图。
/*在多表上创建视图*/
create table student(id int,name char(25));
create table stu_info(id int,glass char(25),province char(25));
insert into student values(1,'liu1'),(2,'li2'),(3,'qiao3');
insert into stu_info values(1,'1ban','anhui'),(2,'2ban','beijing'),(3,'3ban','shanghai');
create view stu_glass(id,name,glass) as select student.id,student.name,info.glass from student,stu_info where student.id=stu_info.id;
三、查看视图查看视图必须要有show view权限,mysql数据库下的user表中保存着这个信息。查看视图的方法包括:
describe、show table status、show create view和在view表中查看。
1.describe语法形式:
describe 视图名;
describe一般简写成desc,效果一样,例如:
describe view_t;
desc view_t;
2.show table status语句查看视图基本信息
语法形式:show table status like ‘视图名’;
例如:
show table status like 'view_t';
3.show create view语句查看视图基本信息
语法形式:show create view 视图名;
show create view view_t;
4.在view表中查看
在mysql中,information_schema数据库下的views表中存储了所有视图的定义。通过对views表的查询,可以查看数据库中所有视图的详细信息,语句如下:
select * from information_schema.views;
四、修改视图
修改视图是指修改数据库中已存在的表的定义,当基表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。
两种方式:
create or replace view语句和alter语句。
1.create or replace view
/*语法格式 create or replace view view_name as select语句;*/
create or replace view view_t as select * from t;desc view_t;
2.alter语句
/*语法格式ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]*/
alter view view_t as select quantity from t;desc view_t;
五、更新视图因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基本表中。
三种方法来更新,分别为:
update、insert和delete
update view_t set quantity=5;
select * from view_t;
insert into t values(3,5);
select * from view_t2;
delete from view_t2 where price=5;
select * from view_t2;
标题为什么有的视图可以更新,而有的会失败呢?
下面情况的视图不可以执行insert、update和delete操作:
**多表连接:**包含distinct 包含聚合函数 包含group by、order by、union、union all包含子查询等.
所以对视图执行DML操作的限制条件还是很多的,大多数情况下我们还是对视图进行查询,如果需要DML操作还是建议对实际表进行操作。
视图是一种虚拟的表,数据来源于从实际表中查询的结果,它可以简化查询操作,以及提高数据库的安全性,本章学习了视图的创建和使用语法,视图可以修改但是有比较多的限制条件,一般还是用于查询。