首页 > 编程笔记 > MySQL笔记 阅读:17

MySQL CREATE VIEW创建视图(附带实例)

MySQL 中的视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。

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

MySQL CREATE VIEW语句

创建视图使用 CREATE VIEW 语句,基本语法格式如下:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

ALGORITHM 的取值有 3 个,分别是 UNDEFINED、MERGE、TEMPTABLE:
CASCADED 与 LOCAL 为可选参数,CASCADED 为默认值,表示更新视图时要满足所有相关视图和表的条件;LOCAL 表示更新视图时满足该视图本身定义的条件即可。

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

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

在单表上创建视图

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

【实例 1】在 t 表上创建一个名为 view_t 的视图,代码如下:
1) 首先创建基本表并插入数据,语句如下:
CREATE TABLE tv (quantity INT, price INT);
INSERT INTO tv VALUES(3, 50);
创建视图语句为:
CREATE VIEW view_t AS SELECT quantity, price, quantity *price FROM tv;
查询视图,执行如下:
mysql> SELECT * FROM view_t;
+----------+-------+-----------------+
| quantity | price | quantity *price |
+----------+-------+-----------------+
|     3    |   50  |         150     |
+----------+-------+-----------------+
默认情况下创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图。

【实例 2】在 tv 表上创建一个名为 view_t2 的视图,代码如下:
mysql> CREATE VIEW view_t2(qty, price, total ) AS SELECT quantity, price, quantity *price FROM tv;
语句执行成功后,查看 view_t2 视图中的数据:
mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|   3  |   50  |  150  |
+------+-------+-------+
可以看到,view_t2 和 view_t 两个视图中的字段名称不同,但数据却是相同的。因此,在使用视图的时候,可能用户根本就不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全。

在多表上创建视图

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

【实例】在表 student 和表 stu_info 上创建视图 stu_glass,代码如下:
1) 首先向两个表中插入数据,输入语句如下:
mysql> INSERT INTO student VALUES(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai');
mysql> INSERT INTO stu_info VALUES(1, 'wuban','henan'),(2,'liuban','hebei'), (3,'qiban','shandong');

2) 创建视图 stu_glass,代码的执行如下:
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;
mysql> SELECT * FROM stu_glass;
+------+----------+--------+
| id   | name     | glass  |
+------+----------+--------+
|    1 | wanglin1 | wuban  |
|    2 | gaoli    | liuban |
|    3 | zhanghai | qiban  |
+------+----------+--------+
视图中的信息很简单,只包含了 id、姓名和班级,id 字段对应 student 表中的 s_id 字段,name 字段对应 student 表中的 name 字段,glass 字段对应 stu_info 表中的 glass 字段。

相关文章