视图是从一个或者多个表及其他视图中通过select
语句导出的虚拟表,数据库中只存放了视图的定义,而并没有存放视图中的数据。浏览视图时所对应数据的行和列数据来自定义视图查询所引用的表,并且在引用视图时动态生成。通过视图可以实现对基表数据的查询与修改。
创建视图是指在指定的数据库表上建立视图。视图可以建立在一张表上,也可以建立在多张表或既有视图上。要求创建用户具有针对视图的create view
权限,以及针对由select
语句选择的每一列上的某些权限。
create [or replace][algorithm ={ undefined|merge|temptable }]
view view_name [(column_list)]
as select_statement
[ with[ cascaded|local] check option ] ;
在视图的from子句中不能使用子查询。
在视图的select语句不能引用系统或用户变量。
在视图的select语句不能引用预处理语句参数。
在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。
在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用check table
语句。
在定义中不能引用temporary
表,不能创建temporary
视图。
不能将触发程序与视图关联在一起。
如在teacher表上创建一个简单的视图,视图名称为teach_view1。
mysql> create view teach_view1
-> as select * from teacher;
可以利用select
语句查询视图teach_view1的数据如下。
mysql> select * from teach_view1;
例如:在student表、course表和score表上创建一个名为stu_score1的视图。视图中保留18级的女生的学号、姓名、电话、课程名和期末成绩。
mysql> create view stu_score1
-> as select student.studentno, sname, phone, cname,final
-> from score join student on student.studentno=score. studentno
-> join course on course.courseno=score.courseno
-> where sex=‘女’ and left(student.studentno,2)= ‘18’;
此视图保存有3个表的数据,可以利用select语句查询视图stu_score1的数据如下。
mysql> select * from stu_score1;
如:创建视图teach_view2,统计计算机学院的教师中的教授和副教授的教师号、教师名和专业。
mysql> create view teach_view2
-> as select teacherno, tname, major
-> from teach_view1
-> where prof like ‘%教授’ and department=‘计算机学院’;
可以通过用select
语句查看视图teach_view2的数据如下。
mysql> select * from teach_view2;
(1)定义视图时基本表可以是当前数据库的表,也可以来自于另外一数据库的基本表,只要在表名前添加数据库名称即可,如mysql.student02。
(2)定义视图时可在视图名后面指明视图列的名称,名称之间用逗号分隔,但列数要与select语句检索的列数相等。例如,定义视图teach_view2可以写成如下方式:
create view teach_view2(教师号,教师名,专业)
as select teacherno, tname, major ……
(3)使用视图查询时,若其基本表中添加了新字段,则该视图将不包含新字段。
(4)如果与视图相关联的表或视图被删除,则该视图将不能再使用。
查看视图是指查看数据库中已存在的视图的定义。查看视图必须要有show view
的权限,在MySQL数据库下的user表中保存着这个信息。
查看视图的方法包括describe
语句、show table status
语句、show create view
语句和查询information_schema数据库下的views表等。
可以使用describe
语句可以查看表的基本定义。同样可以使用describe
语句可以用来查看视图的基本定义。describe
语句查看视图的基本形式与查看表的形式是一样的。
MySQL中,可以使用show table status
语句来查看视图的信息。其语法形式如下:
show table status like ‘view_name’;
MySQL中,show create view
语句可以查看视图的详细定义。语法形式如下
show create view view_name
MySQL数据库中,所有视图的定义都存在information_schema数据库下的views表中。例如,查询information_schema.views 表,可以查看到数据库中所有视图的详细信息。代码如下:
select * from information_schema.views;
其中,*表示查询所有的列的信息;
information_schema.views表示information_schema数据库下面的views表。
修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过create or replace view
语句和alter
语句来修改视图。
create or replace view
语句可以用来修改视图。该语句的使用非常灵活。在视图已经存在的情况下,对视图进行修改;视图不存在时,可以创建视图。create or replace view
语句的语法形式如下:
CREATE OR REPLACE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 视图名[(属性清单)]
AS SELECT语句
[WITH [CASCADED|LOCAL] CHECK OPTION];
alter
语句可以修改表的定义,可以创建索引。不仅如此,alter
语句还可以用来修改视图。alter
语句修改视图的语法格式如下:
alter [algorithm = {undefined|merge|temptable}]
view view_name [(column_list)]
as select语句
[with [cascaded|local]check option];
例如:修改视图teach_view2,统计计算机学院和材料学院的教师中的教授和副教授的教师号、教师名、和专业,并在视图名后面指明视图列名称。
mysql> alter view teach_view2(教师号,教师名,专业)
-> as select teacherno, tname, major
-> from teach_view1
-> where prof like '%教授'
-> and (department=‘计算机学院’ or department=‘材料学院’ );
可以通过用select语句查看视图teach_view2的数据如下。
mysql> select * from teach_view2;
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MySQL数据库中,用户必须拥有drop
权限才能使用drop view
语句来删除视图。
drop view
语句进行删除。drop view
命令可以删除多个视图,各视图名之间用逗号分隔。基本格式如下:
drop view [if exists]视图名列表 [restrict|cascaded]
例如,删除视图V1_student命令如下:
drop view V1_student;