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字段。