视图概述

视图是一种虚拟存在的表,并不在数据库中实际存在,它的数据依赖于真实存在的数据表。通过视图不仅可以看到其依赖数据表中的数据,还可以像操作数据表一样,对数据表中的数据进行添加、修改和删除。与直接操作数据表相比,视图具有以下优点。

简化查询语句

视图不仅可以简化用户对数据的理解,也可以简化对数据的操作。

安全性

通过视图,可以更加方便的进行权限控制,使特定用户只能查询和修改指定的数据,而无法查看修改数据库中的其他数据。

逻辑数据独立性

视图可以帮助用户屏蔽数据表结构变化带来的影响。

视图管理

视图管理包括创建、查看、修改和删除视图。

创建视图

CREATE [OR REPLACE] VIEW 视图名 [(字段列表)] AS select_statement

关于上述语法格式的具体介绍如下。

(1)[OR REPLACE]:可选参数,表示若数据库中已经存在这个名称的视图就替换原有的视图,若不存在则创建视图;

(2)视图名:表示要创建的视图名称,该名称在数据库中必须是唯一的,不能与其他数据表或视图同名;

(3)select_statement:指一个完整的SELECT语句,表示从某个数据表或视图中查出满足条件的记录,将这些记录导入视图中。

视图的基本表可以是一张数据表,也可以是多张数据表,下面分别以视图的基本表为单表和多表这两种情况,通过案例演示如何创建视图,具体如下。

基于单表创建视图

例如,将员工工号empno、员工姓名ename、职位job和部门编号deptno查询出来创建视图view_emp,具体SQL语句如下所示。

CREATE VIEW view_emp AS SELECT empno,ename,job,deptno FROM emp;

下面使用SELECT语句查看view_emp视图,查询语句如下所示。

SELECT * FROM view_emp;

例如,创建一个新的视图view_emp2,视图view_emp2中包含的字段和视图view_emp相同,但视图view_emp2中字段名称和员工表中字段名称不一致,具体创建语句如下所示。

CREATE VIEW view_emp2 (e_no,e_name,e_job,e_deptno) AS SELECT empno,ename,job,deptno FROM emp;

基于多表创建视图

例如,视图中需要使用ems数据库中员工编号empno、员工姓名ename、职位job、部门编号deptno和部门名称dname的信息。 下面根据需求创建视图view_emp_dept,具体创建语句及执行结果如下所示。

CREATE VIEW view_emp_dept(e_no,e_name,e_job,e_deptno,e_deptname)AS SELECT e.empno,e.ename,e.job,e.deptno,d.dname FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

查看视图

创建好视图后,可以通过语句查看视图的字段信息、视图的状态信息、视图的创建语句。

(1)查看视图的字段信息

在MySQL中,使用DESCRIBE语句可以查看视图的字段名、字段类型等字段信息。DESCRIBE语句的基本语法格式如下所示。

DESCRIBE 视图名;

或简写为:

DESC 视图名;

例如,使用DESCRIBE语句查看视图view_emp_dept的字段信息,具体语句如下所示。

DESCRIBE view_emp_dept;

(2)查看视图的状态信息

在MySQL中,可以使用SHOW TABLE STATUS语句可以查看视图和数据表的状态信息。SHOW TABLE STATUS语句的基本语法格式如下所示。

SHOW TABLE STATUS LIKE '视图名';

在上述格式中,LIKE表示后面匹配的是字符串,’视图名’表示要查看的视图的名称,视图名称需要使用单引号包裹起来。

例如,使用SHOW TABLE STATUS语句查看视图view_emp_dept的信息,具体语句如下所示。

SHOW TABLE STATUS LIKE 'view_emp_dept' \G

(3)查看视图的创建语句

SHOW CREATE VIEW 视图名;

例如:

SHOW CREATE VIEW view_emp_dept\G

修改视图

视图的修改指的是修改数据库中存在的视图的定义,当视图的基本表中字段发生变化时,需要对视图进行修改以保证查询的正确性。例如,view_emp视图的基本表emp中员工姓名字段修改了名称,此时再使用视图就会出错。在MySQL中,修改视图的方式有两种,具体如下。

(1)使用CREATE OR REPLACE VIEW语句修改视图

CREATE OR REPLACE VIEW 视图名 AS SELECT语句

使用该语句修改视图时,要求被修改的视图在数据库中已经存在,如果视图不存在,那么将创建一个新的视图。

例如,在视图view_emp_dept原有的基础上新增员工上级工号的字段,具体SQL语句如下所示。

CREATE OR REPLACE VIEW view_emp_dept(e_no,e_name,e_job,e_mgr,e_deptno,e_deptname)AS SELECT e.empno,e.ename,e.job,e.mgr,e.deptno,d.dnameFROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

(2)使用ALTER语句修改视图

ALTER VIEW  AS 

例如,使用ALTER语句将视图view_emp_dept中的部门编号字段进行删除,具体语句如下所示。

ALTER VIEW view_emp_dept (e_no,e_name,e_job,e_mgr,e_deptname)AS SELECT e.empno,e.ename,e.job,e.mgr,d.dnameFROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;

删除视图

当视图不再使用时,可以将其删除。删除视图时,只会删除所创建的视图,不会删除基本表中的数据。删除一个或多个视图可以使用DROP VIEW语句,删除视图的基本语法格式如下所示。

DROP VIEWview_name [,view_name1,…];

例如,使用DROP VIEW语句删除视图view_emp,具体SQL语句如下所示。

DROP VIEW view_emp;

视图数据操作

视图数据操作,就是通过视图来查询、添加、修改和删除基本表中的数据。因为视图是一个虚拟表,不真实保存数据,所以通过视图来操作数据时,实际操作的是基本表中的数据。本节将对视图数据的添加、修改和删除进行讲解。

添加数据

通过视图向基本表添加数据可以使用INSERT语句。例如,通过视图在部门表中添加一个部门信息。 由于此时数据库中还没有部门表对应的视图,所以需要数据库管理员先创建部门表dept对应的视图,具体SQL语句如下所示。

CREATE VIEW view_dept(d_no,d_name) AS SELECT * FROM dept;

通过视图向数据表中添加数据的方式与直接向数据表中添加数据的格式一样,具体SQL语句如下所示。

INSERT INTO view_dept VALUES(50, '人力资源部');

修改数据

通过视图修改基本表的数据,可以使用UPDATE语句。 例如,使用UPDATE语句,通过视图将研究院的部门名称修改为研究中心,具体SQL语句如下所示。

UPDATE view_dept SET d_name='研究中心' WHERE d_name='研究院';

删除数据

通过视图删除基本表的数据,可以使用DELETE语句。 例如,通过视图view_dept删除部门表dept中部门名称为人力资源部的记录,具体SQL语句如下所示。

DELETE FROM view_dept WHERE d_name='人力资源部';

上机实践:图书管理系统中视图的应用

# 创建一个只包含图书名称、图书上架时间和图书状态的视图view_book_state

# 创建一个只包含图书名称、借阅者名称和借阅时间的视图view_book_borrower

# 删除视图view_book_borrower