MySQL数据库 视图

视图

视图可以看作是虚拟的表结构或存储查询,是从一个或几个基本表(或视图)导出来的表,但与基本表不同,他是虚拟的表,也就是说数据库中只存放视图的定义,而不存放视图的对应数据,这些数据仍然存在于基本表中。基本表的数据发生变化的时候,视图的数据也会发生相应的变化。通过视图,SQL用户不必知道底层的表结构及其之间的关系,视图提供了一个统一访问数据的接口。

视图一经定义,就可以和基本表一样进行查询、删除等操作,也可以在一个视图的基础之上再定义其他视图,但对视图的更新操作会有限制。

换言之,视图就是为了某个特定的应用场景而在基本表中衍生出的虚表。

视图的定义

CREATE VIEW <视图的名称>[(<列名>|[,<列名>]...>)]
AS <子查询>
[WITH CHECK OPTION]

其中:

子查询可以是任意复杂的SELECT语句,但通常不允许包含ORDER BY子句和DISTINCT短语。

WITH CHECK OPTION防止用户通过视图对数据进行增加、删除、修改时,对不属于视图范围内的基本表进行操作。这样在视图上增、删、改数据时,DBMS会视图定义的条件,若不满足,则拒绝执行该操作。

如果CREATE VIEW语句中仅指定了视图的名称,省略了组成视图的各个属性列名,则隐含该视图由子查询中SELECT子句目标列的诸字段组成。但一下三种情况必须明确指定组成视图的所有列名:

  1. 其中某个目标不是单纯的属性名而是库函数或列表达式。
  2. 多表联合查询时选出了几个同名列作为视图的字段。
  3. 需要在视图中为某列启用新的更合适的名字。

视图的分类

由于子查询的多样性,视图也分为如下几类。

行列子集视图

若视图是从一个表经选择、投影而导出的,并在视图中包含了包的主关系键或某个候选键,则这类视图我们称之为行列子集视图。

例如:

CREATE VIEW ITteacher
AS 
SELECT Tno,Tn,Prof,Dno
FROM T
WHERE Dno=(SELECT Dno FROM D WHERE Dept="Java")
WITH CHECK OPTION;

多表视图

视图不仅可以建立在单个基本表上,也可以建立在多个基本表(视图)上,这样的视图称之为多表视图。

扫描二维码关注公众号,回复: 11322041 查看本文章
CREATE VIEW TStu(Sno,Sn,Sex,Dno)
AS
SELECT S.Sno,Sn,Sex,S.Dno
FROM ITtechear,TC
WHERE Cn="操作系统" AND S.Sno=Sc.Sno AND SC.Cno=C.Cno;

带表达式的视图

由于视图中的数据并不是实际存储的,定义视图时可以根据应用的需要,设置一些派生属性列。因为这些派生属性列在基本表中不是实际存在的,所以有时候我们也称之为虚拟列,带虚拟列的视图,我们称之为带表达式的视图。

CREATE VIEW SBir(Sno,Sn,Bir)
AS
SELECT Sno,Sn,YEAR(GETDATE())-Age
FROM S;

分组视图

将使用带有集函数和GROUP BY子句查询来定义的视图称为分组视图。

CREATE VIEW StuAvg(Sno,Savg)
AS
SELECT Sno,AVG(Score)
FROM SC
GROUP BY Sno;

注意:最好不要使用SELECT * 作为建立视图的子查询语句,因为该视图一但被建立,此查询数据源表就构成了视图定义的一部分,如果修改了数据源表的结构,数据源表与视图的映像关系将会收到破坏,该视图也就不能正常工作了。

修改视图

创建一个视图后,若发现视图定义不满足实际需要,可以对其定义进行修改。

修改视图的语法格式如下:

ALTER VIEW <视图名称>[(<列名>[,<列名>...])]
AS <子查询>
[WITH CHECK OPTION];

删除视图

DROP VIEW <视图名称>;

删除一个视图后,只会删除该视图在数据字典中的定义,而与该视图有关的基本表中的数据不会受到任何影响,有该视图导出的其他视图的定义也不会被删除,但是却会变得无意义。需要用户将这些导出视图进行删除。

视图查询

视图查询即使用视图查询数据。用户对视图的查询与对基本表的查询是相似的。但在系统内部,对视图的查询必须先转换为对基本表的查询,通常这种转换并不复杂。

SELECT Tno,Tn
FROM ITteacher
WHERE Prof="讲师";

上述查询可以对应下面对基本表的查询

SELECT Tno,Tn
FROM T
WHERE (Prof="讲师" AND Dno=(
	SELECT Dno FROM D WHERE Dept="Java"
));

由此可以看出,当我们要对基本表进行较为复杂的查询时,我们可以建立相应的视图,直接在视图层面进行数据的查询会简化查询逻辑与步骤。

视图的更新

视图更新即使用视图来更新数据,是指通过INSERT、DELETE、UPDATE来修改数据。由于视图是虚表,因此对视图更新时,最终还是会转换为对基本表的更新。为了防止用户对不属于视图范围内的表进行修改,可以在定义视图时加上WITH CHECK OPTION子句。

在关系型数据库中,为了更好的管理我们的数据。我们在更新数据时,尽量符合如下规范和约束:

  1. 若视图是一个多表视图,那么执行更新操作时,尽量每次操作只能影响一个表。
  2. 若视图导出时包含有分组和聚合操作,则不允许对此视图进行数据更新操作。
  3. 行列子集视图可进行更新操作。

UPDATE操作

UPDATE ITteacher
SET Tn="张三"
WHERE Tno="05";

INSERT操作

INSERT 
INTO ITteacher
VALUES("07","赵四","讲师","01");

DELETE操作

DELETE
FROM ITteacher
WHERE Tno="01";

视图的作用及缺点

对于所引用的基本表而言,视图相当于对于特定应用场景的一次筛选。

  1. 视图能够使用户以多个角度看待同一数据
  2. 视图能够简化用户操作
  3. 视图为重构数据库提供了一定的逻辑独立性
  4. 视图能够为机密数据提供安全保护

视图虽然能够带来很多便利,但同时使用视图会带来一定的负面影响,例如:

  1. SQL必须将视图查询转换为基本表查询,这会在性能上造成负面影响。
  2. 对于简单的视图而言,修改会很方便,但是对于较为复杂的视图,修改会变得非常困难,甚至视图不能修改。

猜你喜欢

转载自blog.csdn.net/hbn13343302533/article/details/99350379