MySQL数据库应用案例课堂
上QQ阅读APP看书,第一时间看更新

7.2 创建视图

视图中包含SELECT查询的结果,因此视图的创建基于SELECT语句和已存在的数据表。视图可以建立在一张表上,也可以建立在多张表上。本节主要介绍创建视图的方法。

7.2.1 创建视图的语法形式

创建视图使用CREATE VIEW语句,基本语法格式如下:

  CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
      VIEW view_name [(column_list)]
      AS SELECT_statement
      [WITH [CASCADED | LOCAL] CHECK OPTION]

其中,CREATE表示创建新的视图;REPLACE表示替换已经创建的视图;ALGORITHM表示视图选择的算法;view_name为视图的名称,column_list为属性列;SELECT_statement表示SELECT语句;WITH [CASCADED | LOCAL] CHECK OPTION参数表示视图在更新时保证在视图的操作权限范围之内。

ALGORITHM参数的取值有3个,分别是UNDEFINED、MERGE和TEMPTABLE。UNDEFINED表示MySQL将自动选择算法;MERGE表示将使用的视图语句与视图定义合并,使得视图定义的某一部分取代语句对应的部分;TEMPTABLE表示将视图的结果存入临时表,然后用临时表来执行语句。

CASCADED与LOCAL为可选参数,CASCADED为默认值。表示更新视图时要满足所有相关视图和表的条件;LOCAL表示更新视图时满足该视图本身定义的条件即可。

该语句要求具有针对视图的CREATE VIEW权限,以及针对由SELECT语句选择的每一列上的某些权限。如果还有OR REPLACE子句,必须在视图上具有DROP权限。

视图属于数据库。在默认情况下,将在当前数据库中创建新视图。要想在给定数据库中明确创建视图,创建时应将视图名称设置为db_name.view_name。

7.2.2 在单表上创建视图

在MySQL中,可以在单个数据表上创建视图。

【例7.1】在t表格上创建一个名为view_t的视图。

首先创建基本表并插入数据,使用的SQL语句如下:

  CREATE TABLE t (quantity INT, price INT);
  INSERT INTO t VALUES(3, 50);

语句执行情况如下:

  mysql> CREATE TABLE t (quantity INT, price INT);
  Query OK, 0 rows affected (0.93 sec)
  
  mysql> INSERT INTO t VALUES(3, 50);
  Query OK, 3 rows affected (0.14 sec)
  Records: 1  Duplicates: 0  Warnings: 0

创建视图的语句如下:

  CREATE VIEW view_t AS SELECT quantity, price, quantity *price FROM t;

语句执行情况如下:

  mysql> CREATE VIEW view_t AS SELECT quantity, price, quantity *price FROM t;
  Query OK, 0 rows affected (0.01 sec)
  mysql> SELECT * FROM view_t;
  +----------+-------+-----------------+
  | quantity | price | quantity *price |
  +----------+-------+-----------------+
  |     3    |   50   |        150       |
  +----------+-------+-----------------+
  1 row in set (0.00 sec)

默认情况下,创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图。

【例7.2】在t表格上创建一个名为view_t2的视图。

代码如下:

  mysql> CREATE VIEW view_t2(qty, price, total ) AS SELECT quantity, price, quantity *price FROM t;
  Query OK, 0 rows affected (0.01 sec)

语句执行成功,查看view_t2视图中的数据:

  mysql> SELECT * FROM view_t2;
  +------+-------+-------+
  | qty  | price | total |
  +------+-------+-------+
  |    3  |   50   |  150  |
  +------+-------+-------+
  1 row in set (0.00 sec)

可以看到,view_t2和view_t两个视图中的字段名称不同,但数据却是相同的。因此,在使用视图的时候,可能用户根本就不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全。

7.2.3 在多表上创建视图

在MySQL中,也可以在两个或者两个以上的表上创建视图,可以使用CREATE VIEW语句实现。

【例7.3】在表student和表stu_info上创建视图stu_glass。

首先向两个表中插入数据,输入语句如下:

  mysql> INSERT INTO student VALUES(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai');
  Query OK, 3 rows affected (0.00 sec)
  Records: 3  Duplicates: 0  Warnings: 0
  
  mysql> INSERT INTO stu_info VALUES(1, 'wuban','henan'),(2,'liuban','hebei'), (3,'qiban','shandong');
  Query OK, 3 rows affected (0.02 sec)
  Records: 3  Duplicates: 0  Warnings: 0

创建视图stu_glass,语句如下:

  CREATE VIEW stu_glass (id,name, glass) AS SELECT student.s_id,student.name, stu_info.glass FROM student,stu_info WHERE student.s_id=stu_info.s_id;

代码的执行如下:

  mysql> CREATE VIEW stu_glass (id,name, glass) AS SELECT student.s_id, student.name ,stu_info.glass FROM student ,stu_info WHERE student.s_id=stu_info.s_id;
  Query OK, 0 rows affected (0.00 sec)
  
  mysql> SELECT * FROM stu_glass;
  +-------+-----------+--------+
  | id    | name      | glass  |
  +-------+-----------+--------+
  |    1  | wanglin1  | wuban  |
  |    2  | gaoli     | liuban |
  |    3  | zhanghai  | qiban  |
  +-------+-----------+--------+
  3 rows in set (0.00 sec)

这个例子就解决了本章开篇提出的那个问题,通过这个视图可以很好地保护基本表中的数据。这个视图中的信息很简单,只包含了id、name和glass三个字段,id字段对应student表中的s_id字段,name字段对应student表中的name字段,glass字段对应stu_info表中的glass字段。