Mysql教程

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个表上创建一个视图,用来显示学生姓名、学号、班级、院系、所选 课程和课程成绩。


关注微信获取最新动态