什么是视图?


视图是一个或几个基本表(或视图)导出的表,与基本表不同,它是一个虚表,数据库中只存放视图的定义,不存放数据,数据仍然存放在基本表中。当基本表中的数据发生变化,视图也会相应改变。




视图的作用是什么?


1. 视图可以简化用户操作,将用户感兴趣的数据才从多张表中查询出来放入一个视图,使数据库结构简单,清晰,并可以简化用户数据查询操作。



2. 视图对重构数据库提供了一定程度上的逻辑独立性。如在将数据库中某个表拆分为多个表,此时可以创建一个视图讲几个表中的数据合并至一个视图中,这样应用程序端的代码就无需改变。



3. 视图能对机密数据提供安全保护。可以对不同用户定义不同视图,这要就有效保护了机密数据。



4. 视图可以简化数据查询,为经常要做的数据查询创建一个视图,以后可以通过其他基本表或视图与该视图的连接来轻松地查询出想要的数据。





下面用实例来展示如何创建视图,查询视图,更新视图和删除视图。






用到的数据库表



Employee表:Id(PK), Name, Age, Sex



EmployeeDetails表:Id(PK, FK), Mobile, Note





创建视图



SQL语句



/*创建单表视图*/
CREATE VIEW EmployeeView
AS
SELECT Name,Age,Sex FROM Employee

/*创建多表视图*/
CREATE VIEW EmployeeInfoView
AS
SELECT e.Name,e.Age,e.Sex,d.Mobile,d.Note 
FROM Employee e,EmployeeDetails d 
WHERE e.id = d.id

/*从视图中创建视图*/
CREATE VIEW NameView
AS
SELECT Name FROM EmployeeView

/*创建包含聚合函数的视图*/
CREATE VIEW AverageAgeView (AvgAge)
AS
SELECT AVG(Age) from Employee

/*限制向视图中增添,修改和删除的数据满足子查询条件*/
CREATE VIEW CheckTestView
AS
SELECT * FROM Employee WHERE Age>30
WITH CHECK OPTION /*保证插入的数据Age的值必须大于30*/



SQL语法


CREATE VIEW ViewName [Column,...]



AS 



Query



[WITH CHECK OPTION]






注意事项



1. Query不能包含ORDER BY和DISTINCT语句;



2. WITH CHECK OPTION为可选,他限制了向视图中添加或修改数据时数据必须满足的条件;



3. 若某个目标列是聚合函数或表达式,必须要指定列名;



4. 若查询中来自不同的基本表或视图中的列具有相同的名称,必须要显式指定视图的列名。



5. 创建视图时并不执行Query,只是将视图的定义存入数据字典,当查询视图时,才会按照视图的定义执行Query.







查询视图



在查询视图时,RDBMS会先对视图的有效性进行检测,看查询中涉及的表和视图是否存在,若存在,则从数据字典中取出视图的定义,并把定义中的Query与用户的查询相结合生成相应的查询语句,最后执行查询并发挥结果。





SQL语句



SELECT * FROM EmployeeView WHERE Sex=1 ORDER BY Age

SELECT AVG(Age) FROM EmployeeView WHERE SEX=0



对视图进行查询和对基本表进行查询相同。






更新视图



更新视图即为对视图进行增删改,并不是所有的视图都可以进行更新,因为视图的更新最终是会被转换为对基本表的更新,若更新不能唯一地有意义地转换成对相应基本表的更新,则不合法。






SQL语句



/*向EmployeeView视图中添加一条记录*/
INSERT INTO EmployeeView (Name,Age,Sex) VALUES('Jack','30',1)

/*更新EmployeeView中的一条记录*/
UPDATE EmployeeView SET Age=25 WHERE Name='Carter'

/*AvgAge是通过聚合函数AVG()得到的数值,对它更新并不能转换为对基本表的更新,所以会报错*/
UPDATE AverageAgeView SET AvgName = 40

/*删除EmployeeView中的一条记录*/
DELETE FROM EmployeeView WHERE Name='Jason'






删除视图


删除视图与删除基本表的语句相同。




SQL语句


/*删除视图AverageAgeView*/
DROP VIEW AverageAgeView