8.2创建视图
创建视图是指在已存在的数据库表上建立视图。视图可以建立在一张表中,也可以建 立在多张表中。本节主要讲解创建视图的方法。
8.2.1创建视图的语法形式
MySQL中,创建视图是通过SQL语句CREATE VIEW实现的。其语法形式如下:
CREATE [ ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE }] VIEW视图名丨(属性清单)]AS SELECT 语句[WITH [CASCADED|LOCAL] CHECK OPTION ];
其中,ALGORITHM是可选参数,表示视图选择的算法;“视图名”参数表示要创建 的视图的名称;“属性清单”是可选参数,其指定了视图中各个属性的名词,默认情况下与SELECT语句中查询的属性相同;SELECT语句参数是一个完整的查询语句,表示从某个表中查出某些满足条件的记录,将这些记录导入视图中;WITH CHECK OPTION是可选参数,表示更新视图时要保证在该视图的权限范围之内。
ALGORITHM包括3个选项 UNDEFINED、MERGE 和 TEMPTABLE。其中, UNDEFINED选项表示MySQL将自动选择所要使用的算法;MERGE选项表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分;TEMPTABLE 选项表示将视图的结果存入临时表,然后使用临时表执行语句。
CASCADED是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL表示更新视图时,要满足该视图本身的定义的条件即可。
技巧:使用CREATE VIEW语句创建视图时,最好加上WITH CHECK OPTION参数。而且,最好加上CASCDED参数。这样,从视图上派生出来的新视图后,更新 新视图需要考虑其父视图的约束条件。这种方式比较严格,可以保证数据的安全性。
创建视图时,需要有CREATE VIEW的权限。同时,应该具有查询涉及的列的SELECT 权限。在MySQL数据库下面的user表中保存这些权限信息,可以使用SELECT语句査询.SELECT语句査询的方式如下:
SELECT Select_priv, Create_view_priv FROM mysql.user WHERE user=’用户名’
其中,Select_priv属性表示用户是否具有SELECT权限,Y表示拥有8SELECT权限,N表示没有;Create_view_priv属性表示用户是否具有CREATE VIEW权限;mysql.user表示MySQL数据库下面user表;“用户名”参数表示要查询哪个用户是否拥有DROP权 限,该参数需要单引号引起来。因为该数据库系统中只有rooy用户,所以查询出来的结果 只有root用户的权限。该语句的执行结果如下:
mysql> SELECT Select_priv, Create_view_priv FROM mysql.user WHERE user='root';
mysql> SELECT Select_priv, Create_view_priv FROM mysql.user WHERE user='root'; +-------------+------------------+ | Select_priv | Create_view_priv | +-------------+------------------+ | Y | Y | +-------------+------------------+ 1 row in set (0.12 sec)
结果显示,“Select_priv”属性和“Create_view_priv”属性的值都为Y。这表示其具 有SELECT权限和CREATE VIEW权限。
8.2.2在单表上创建视图
MySQL中可以在单个表上创建视图。
【示例8-2】下面在department表上创建一个简单的视图,视图名称为department_ viewlo创建视图的代码如下:
CREATE VIEW department_view1 AS SELECT * FROM department;
代码执行如下:
mysql> CREATE VIEW department_view1 -> AS SELECT * FROM department; Query OK, 0 rows affected (0.03 sec)
执行结果显示QUERY OK,表示代码执行成功;0 rows affected表示创建视图并不影响以前的数据,因为视图只是一个虚拟表。使用DESC语句查询表的结构,结果显示如下:
mysql> desc department_view1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | d_id | int(4) | NO | | NULL | | | d_name | varchar(20) | NO | | NULL | | | function | varchar(50) | YES | | NULL | | | address | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 4 rows in set (0.09 sec)
结果显示,视图department_view的属性与department表的结果一样。因为,在未指定视图的属性列表的情况下,视图的属性名与SELECT语句查询的属性名相同。该示例中的SELECT语句查询出了DEPARTMENT表的所有列。那么,视图DEPARTMENT_VIEW就包含了department表的所有列。
【示例8-3】下面在department表上创建一个名为department_view2的视图。创建视图的代码如下:
CREATE VIEW department_view2 ( name, fuction, location ) AS SELECT d_name, function, address FROM department;
代码执行如下:
mysql> CREATE VIEW
-> department_view2 ( name, fuction, location )
-> AS SELECT d_name, function, address -> FROM department;
Query OK, 0 rows affected (0.00 sec)
执行结果显示代码执行成功。使用0£5€语句查询表的结构,结果显示如下:
mysql> desc department_view2; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | name | varchar(20) | NO | | NULL | | | function | varchar(50) | YES | | NULL | | | loction | varchar(50) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
结果显示,视图department_view2的属性分别为name、fuction和location。因为,在创建视图时指定了属性列表。视图的属性名与属性列表中的属性名相同。该示例中的SELECT语句查询出了department表的d_name、function和address这3列。那么,视图department_view2中的列就分别对应着这3列。使用视图时,用户接触不到实际操作的表和字段。这样可以保证数据库的安全。
8.2.3在多表上创建视图
MySQL中也可以在两个或两个以上的表上创建视图,也是使用CREATE VIEW语句实现的。
【示例8-4】下面在department表和worker表上创建一个名为worker_viewl的视图。创建视图的代码如下:
CREATE ALGORITHM=MERGE VIEW worker_view1 ( name, department,sex, age,address ) AS SELECT name, department.d_name, sex, 2009-birthday, address FROM worker, department WHERE worker
代码执行如下:
mysql> CREATE ALGORITHM=MERGE VIEW worker_view1(name,department,sex,age,address)as select name,department.d_name,sex,2009- birthday,address from worker ,department where worker.d_id=department.d_id with local check option; Query OK, 0 rows affected (0.03 sec)
执行结果显示代码执行成功。使用DESC语句查询表的结构,结果显示如下:
mysql> DESC worker_view1; +------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+-------+ | name | varchar(20) | NO | | NULL | | | department | varchar(20) | NO | | NULL | | | sex | varchar(4) | NO | | NULL | | | age | double(23,6) | YES | | NULL | | | address | varchar(50) | YES | | NULL | | +------------+--------------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
结果显示,视图worker_view1的属性分别为name、department、sex、age和loction。 视图指定的属性列表对应着两个不同的表的属性列。视图的属性名与属性列表中的属性名相同。该示例中的SELECT语句查询出了department表的d_name字段,还有worker表的 name、sex、birthda和Daddress。其中,department表的d_name字段对应视图的depaerment字段;worker表的birthday字段进行减法操作后,对应视图的age字段。而且,视图worker_viewl 的 ALGORTTHM 的值指定为 MERGE。还增加了 WITH LOCAL CHECK OPTION约束。本实例说明,视图可以将多个表上的操作简洁的表示出来。
技巧:同时在多个表上创建视图是非常有用的。比如,系统中有student表、department表、score表和grade表,分别存储学生的信息、院系信息、课程信息和成绩信息。 可以在这4个表上创建一个视图,用来显示学生姓名、学号、班级、院系、所选 课程和课程成绩。