【数据库原理】关系数据库标准语言SQL与关系数据库管理系统SQL Server(七)

视图View.

前面在关系数据库标准语言SQL与关系数据库管理系统SQL Server(一)中介绍SQL的一些基本概念时,就提到过视图。视图是一种虚拟的数据表,它的内容由查询来定义,在用户看来,视图时通过不同路径去看一个实际表,就像一个窗口一样,通过窗口去看外面的高楼,可以看到高楼的不同部分,而透过视图可以看到DB中用户所感兴趣的内容。
同基本表一样,视图包含一系列带有名称的列和行数据,但视图在数据库中并不是以数据值存储集的形式存在,除非是索引视图。视图中的行和列数据来自定义视图的查询所引用的基本表,并且在引用视图时动态生成。视图通常用来集中、简化和自定义每个用户对数据库的不同认识。视图可以用作安全机制,方法是允许用户通过视图访问数据,而不授予用户直接访问与该视图相关联的基本表的权限。

创建视图.

我们在给出完整的创建视图的语法格式之前,先通过几个例子来对这类语句有一个直观的认识。

【例】创建一个计算机系教师情况的视图Sub_T。

CREATE VIEW Sub_T
AS SELECT TNo,TN,Prof
   FROM T
   WHERE Dept='计算机'

上述代码中,视图的名字为Sub_T,由子查询中的三列TNo、TN以及Prof组成。该视图创建之后,用户对于它的访问被限制在“计算机系”之内,并且只能看到TNo、TN以及Prof三个字段的内容,从而达到了数据保密的目的。
需要注意的是,视图创建后,数据字典中只存放了该视图的定义,上述代码中的子查询语句并不执行。当用户对于视图进行操作时,才按照视图的定义将对应的数据从基本表中取出。

【例】创建一个学生情况视图S_SC_C(其中包括学号、姓名、课程名以及成绩)。

CREATE VIEW S_SC_C(SNo,SN,CN,Score)
AS SELECT S.SNo,SN,CN,Score
   FROM S,C,SC
   WHERE S.SNo=SC.SNo AND SC.CNo=C.CNo

该视图由三个表S、C和SC连接得到,在S表和SC表中均存在SNo列,所以需要指定视图列名。

【例】创建一个学生平均成绩视图S_Avg。

CREATE VIEW S_Avg(SNo,Avg)
AS SELECT SNo,Avg(Score)
   FROM SC
   GROUP BY SNo

该视图的列之一的Avg是库函数的计算结果,所以定义时需要指明列名。
见过了上面三个例子,我们再给出CREATE VIEW语句的语法格式:

CREATE VIEW NAME (Col_1,Col_2,...,Col_n)
AS select_statement
  • NAME,视图的名称。
  • Col_i,视图的列名称,当且仅当下列情况发生时,我们需要指明视图的列名称:①存在属性列是从算术表达式、函数或常量派生的;②多个列可能会有着相同的名称(由于连接);③用户想要视图中的某个列的指定名称不同于其来源列的名称(简言之,属性列是可以自定义命名的)。
  • select_statement,定义视图的SELECT语句,该语句可以使用多个表以及其他的视图。

修改视图.

SQL提供了ALTER VIEW语句用于修改视图。

【例】修改创建好的学生情况视图S_SC_C,去掉学号属性列,即只保留姓名、课程名以及成绩。

ALTER VIEW S_SC_C (SN,CN,Score)
AS SELECT SN,CN,Score
   FROM S,C,SC
   WHERE S.SNo=SC.SNo AND SC.CNo=C.CNo

删除视图.

SQL提供语句DROP VIEW用于删除视图。

【例】删除计算机系教师情况视图Sub_T.

DROP VIEW Sub_T

注意视图删除后,只会删除视图在DD中的定义(实际上保存也只保存了定义),而派生出该视图的基本表并不会受到影响。但由该视图导出的其它视图都已经失去了意义,虽然它们的定义还被保存着。

查询视图.

我们说过视图就像一张虚拟的表,对于视图的查询操作和对基本表的一模一样。

【例】查询计算机系教师情况视图Sub_T中职称为教授的教师号和姓名。

SELECT TNo,TN
FROM Sub_T
WHERE Prof='教授'

本次查询的执行过程首先是系统从DD(Data Dictionary)中找到Sub_T的定义,然后把该定义和用户的查询结合起来,转换成等价的对基本表的操作,这一转换的过程称为视图消解View Resolution。上面的代码就相当于执行以下查询:

SELECT TNo,TN
FROM T
WHERE Prof='教授' AND Dept=计算机''

更新视图.

由于视图是一张虚表,我们所有对于视图的更新操作:

  • 添加INSERT
  • 修改UPDATE
  • 删除DELETE

基本テーブルの操作に変換され、すべての構文と基本テーブルの更新操作はまったく同じです。リレーショナルデータベースの標準言語SQLおよびリレーショナルデータベース管理システムSQL Server(6)を参照できます理論的には実行不可能な更新もあれば、実装が難しい更新もあり、実行可能な更新のみを考慮します。

[例]コンピュータサイエンス学科の教師の状況ビューにレコード(教師ID:T6、名前:Li Dan、肩書き:准教授)を追加します。

INSERT INTO Sub_T (TNo,TN,Prof)
VALUES ('T6','李丹','副教授')

上記のクエリ操作と同様に、システムは最初にDDからSub_Tの定義を見つけてから、その定義をユーザーが実行する操作と組み合わせ、それを基本テーブルの操作に変換します。

おすすめ

転載: blog.csdn.net/weixin_44246009/article/details/108065492