导图社区 数据库系统概论-第三章
关系数据库标准语言SQL,SQL概述,数据定义,数据查询,数据更新,空值处理,视 图。希望对小伙伴有所帮助!
编辑于2022-06-04 15:34:41关系数据库标准语言SQL
SQL概述
特点
1.综合统一。SQL集数据定义语言、数据操纵语言、数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动。 2.高度非过程化。用 SQL 进行数据操作时,只要提出“做什么”,而无须指明“怎么做”,因此无 须了解存取路径。存取路径的选择以及 SQL 的操作过程由系统自动完成。这不 但大大减轻了用户负担,而且有利于提高数据独立性。 3.面向集合的操作方式。非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。而 SQL 采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插 入、删除、更新操作的对象也可以是元组的集合。 4.以同一种语法结构提供多种使用方式。SQL 既是独立的语言,又是嵌入式语言。作为独立的语言,它能够独立地用于 联机交互的使用方式;作为嵌入式语言,SQL 语句能够嵌入到高级语言(例如 C、c++、java)程序中,供程序员设计程序时使用。 5.语言简洁,易学易用。SQL 功能极强,由于设计巧妙,语言十分简洁,完成核心功能只用了 9 个动词。
基本概念
支持SQL的关系数据库管理系统同样支持关系数据库三级模式结构。 外模式:若干视图和部分基本表; 模式:若干基本表; 内模式:若干存储文件。
视图
视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中 存放视图的定义而不存放视图对应的数据。这些数据仍存放在导出视图的基本表 中,因此视图是一个虚表。视图在概念上与基本表等同,用户可以在视图上再定义 视图。
基本表
基本表是本身独立存在的表,在关系数据库管理系统中一个关系就对应一个基本 表,一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在 存储文件中。
存储文件
存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理结构对最终用户 是隐蔽的。
数据定义
 SQL的数据定义功能包括:模式定义、表定义、视图和索引的定义。 一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。
模式的定义与删除
定义模式
模式定义语句: CREATE SCHEMA<模式名>AUTHORIZATION<用户名>; 若没有指定<模式名>,那么<模式名>就是<用户名>。 要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得了数据库管 理员授予的 CREATE SCHEMA 的权限。 定义模式实际上定义了一个命名空间,在这个空间中可以进一步定义模式包含的数据库对象。也即在CREATE SCHEMA 中可以接受 CREATE TABLE, CREATE VIEW 和 GRANT 子句。 也就是说用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定 义授权。即 CREATE SCHEMA<模式名>AUTHORIZATION <用户名>[<表定义子句视图定义子句 <授权定义子句>]; 实例:CREATE SCHEMA"S-T"AUTHORIZATION WANG; 为用户WANG定义一个模式S-T。
删除模式
删除模式语句: DROP SCHEMA <模式名> <CASCADE|RESTRICT>; 其中 CASCADE 和 RESTRICT 两者必选其一。 选择了 CASCADE(级联),表示在删除 模式的同时把该模式中所有的数据库对象全部删除; 选择了 RESTRICT(限制),表 示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行。只有当 该模式中没有任何下属的对象时才能执行 DROP SCHEMA 语句。
基本表的定义、删除与修改
定义基本表
SQL语句使用CREATE TABLE语句定义基本表,其基本格式如下: CREATE TABLE <表名> (<列名><数据类型> [列级完整性约束条件] [,<列名><数据类型> [列级完整性约束条件]] ``` [,<表级完整性约束条件>]); 如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则既可 以定义在列级也可以定义在表级。 
修改基本表
SQL语言用ALTER TABLE语句修改基本表,其一般格式为: ALTER TABLE <表名> [ADD [COLUMN <新列名><数据类型> [完整性约束]] [ADD <表级完整性约束>] [DROP [COLUMN] <列名> [CASCADE|RESTRICT]] [DROP CONSTRAINT <完整性约束名> [RESTRICT|CASCADE]] [ALTER COLUMN <列名><数据类型>]; 解释: <表名>是要修改的基本表。 ADD子句用于增加新列、新的列级完整性约束条件和新的表级约束条件。 DROP COLUMN 子句用于删除表中的列。 DROP CONSTRAINT子句用于删除指定的完整性约束条件。 ALTER COLUMN子句用于修改原有的列定义。 实例: ALTER TABLE STUDENT ADD S_entrance DATE; 向STUDENT表增加入学时间列,数据类型为日期型。
删除基本表
SQL语言使用DROP TABLE语句删除它,其一般格式为: DROP TABLE <表名> [RESTRICT|CASCADE]; 默认都是RESTRICT。 
数据类型
SQL中使用数据类型来实现关系模型中域的概念。定义表的各个属性时需要指明其数据类型及长度。 数据类型 含义 CHAR(n),CHARACTER(n) 长度为n的定长字符串 VARCHAR(n),CHARACTERVARYING(n) 最大长度为n的变长字符串 CLOB 字符串大对象 BLOB 二进制大对象 INT,INTEGER 长整数(4字节) SMALLINT 短整数(2字节) BIGINT 大整数(8字节) 
索引的建立与删除
数据库索引有多种类型,常见索引包括顺序文件上的索引、B+树索引、散列索引、位图索引等。 ①顺序文件上的索引是针对按指定属性值升序或降序存储的关系,在该属性 上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。 ②B+树索引是将索引组织成 B+树形式,B+树的叶结点为属性值和相应的元组指 针。B+树索引具有动态平衡的优点。 ③散列索引是建立若干个桶,将索引属性按照其散列函数值映射到相应桶中,桶中 存放索引属性值和相应的元组指针。散列索引具有查找速度快的特点。 ④位图索引是用位向量记录索引属性中可能出现的值,每个位向量对应一个可能 值。 用户不必也不能显式地选择索引。 索引是关系数据库管理系统的内部实现技术,属于内模式的范畴。
建立索引
SQL语言使用CREATE INDEX语句建立索引,其一般格式为: CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名> [<次序>][,<列名>[<次序>]]```); 解释: <表名>是要建立索引的基本表的名字。索引可以建立在该表的一列或多列上,各列之间用逗号分隔。 每个<列名>后面还可以用<次序>指定索引值的排列次序,可选ASC(升序)或DES(降序),默认为ASC。 UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。 CLUSTER 表示要建立的索引是聚簇索引。 
修改索引
修改索引使用ALTER INDEX语句,其一般格式为 ALTER INDEX <旧索引名> REMOVE TO <新索引名>; 实例: ALTER INDEX SCno REMOVE TO SCSno;
删除索引
删除索引使用DROP INDEX语句,其一般格式为: DROP INDEX <索引名>; 实例: DROP INDEX Stusname; 删除索引时,系统会同时从数据字典中删除有关该索引的描述。
数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。 关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的响应信息。
数据查询
数据查询是数据库的核心操作,其一般格式为 SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]``` FROM <表名或视图名> [,<表名或视图名>```] |(<SELECT语句>) [AS] <别名》 [WHERE <条件表达式>] [GROUP BY <列名 1> [HAVING <条件表达式>]] [ORDER BY <列名 2> [ASC|DESC]]; 解释: 根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标列表达式选出元组中的属性值形成结果表。
单表查询
即仅涉及一个表的查询。
选择表中的若干列
选择表中的全部或部分列即关系代数的投影运算。
查询指定列
通过在SELECT子句的<目标列表达式>中指定要查询的属性列。 实例: SELECT Sno,Sname FROM Student; 解释: 从Student表中取出一个元组,取出该元组在属性Sno和Sname上的值,形成一个新的元组作为输出。对Student表中的所有元组做相同的处理,最后形成一个结果关系作为输出。 <目标列表达式>中的各个列的先后顺序可以与表中的顺序不一致。
查询全部列
一种方法是在 SELECT 关键字后列出所有列名;如果列的显示顺序与其在基表 中的顺序相同,也可以简单地将<目标列表达式>指定为*。 实例: SELECT * FROM Student; 等价于 SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student;
查询经过计算的值
SELECT子句中的<目标列表达式>不仅可以是表中的属性列,也可以是表达式。 用户还可以通过指定别名来改变查询结果的列标题。 
选择表中的若干元组
消除取值重复的行
两个本来并不完全相同的元组在投影到指定的某些列上后,可能会变成相同的 行。可以用 DISTINCT 消除它们。如果没有指定该关键词,怎么默认为ALL。 实例: SELECT DISTINCT Sno FROM SC;
查询满足条件的元组
查询满足指定条件的元组可以通过 WHERE 子句实现。以下是WHERE子句常用的查询条件。 比较:=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符 确定范围:BETWEEN AND, NOT BETWEEN AND 确定集合:IN, NOT IN 字符匹配:LIKE, NOT LIKE 空值:IS NULL, IS NOT NULL 多重条件(逻辑运算):AND,OR,NO
比较大小
实例: SELECT Sname FROM Student WHERE Sdept='CS'; 解释: 对Student表进行全表扫描,取出一个元组,检查该元组在Sdept列的值是否等于'CS',如果相等就取出Sname列的值形成一个新的元组输出;否则就跳过。遍历该表。
确定范围
谓词BETWEEN``AND``和NOT BETWEEN ```AND``可以用来查找属性值在(不在)指定范围内的元组,闭区间。 实例: SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;
确定集合
谓词IN可以用来查找属性值属于指定集合的元组。与之相反的是NOT IN。 实例: SELECT Sname,Ssex FROM Student WHERE Sdept IN ('CS','MA','IS');
字符匹配
谓词LIKE可以用来进行字符串的匹配。其一般语法格式如下: [NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>'] 含义是查找指定的属性列值与<匹配串>相匹配的元组,<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。 %(百分号)代表任意长度(可以为0)的字符串。 _(下横线)代表任意单个字符。 如果LIKE后面的匹配串中不含通配符,则可以用=取代LIKE谓词,用!=或<>运算符取代NOT LIKE谓词。 如果用户要查询的字符串本身就含有通配符%或_,这时就要使用ESCAPE '<换码字符>'短语对通配符进行转义。 
涉及空值的查询
实例: SELECT Sno,Cno FROM SC WHERE Grade IS NULL;/*分数Grade是空值*/ 这里的'IS'不能用等号(=)代替。
多重条件查询
逻辑运算符AND和OR可用来连接多个查询条件。AND的优先级高于OR,可以用括号改变优先级。 实例: SELECT Sname FROM Student WHERE Sdept='CS' AND Sage<20;
ORDER BY子句
用户可以用 ORDER BY 子句对查询结果按照一个或多个属性列的升序(ASC)或 降序(DESC)排列,默认值为升序。 
聚集函数
为了进一步方便用户,增强检索功能,SQL 提供了许多聚集函数,主要有: COUNT(*) 统计元组个数 COUNT([DISTINCT|ALL]<列名>) 统计一列中值的个数 SUM([DISTINCT|ALL]<列名>) 计算一列值的总和 AVG([DISTINCT|ALL]<列名>) 计算一列值的平均值 MAX([DISTINCT|ALL]<列名>) 求一列值中的最大值 MIN([DISTINCT|ALL]<列名>) 求一列值中的最小值 如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。 如果不 指定 DISTINCT 短语或指定 ALL 短语(ALL 为默认值),则表示不取消重复值。 当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而只处理非空值。 WHERE子句中不能使用聚集函数作为条件表达式。 聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。 实例: SELECT COUNT(*) FROM Student;
GROUP BY子句
GROUP BY 子句将查询结果按某一列或多列的值分组,值相等的为一组。 对查询结果分组的目的是为了细化聚集函数的作用对象。分组后聚集函数将作 用于每组,即每一组都有一个函数值。 如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的 组,则可以使用 HAVING 短语指定筛选条件。 WHERE 子句与 HAVING 短语的区别在于作用对象不同。WHERE 子句作用于基本表 或视图,从中选择满足条件的元组。 HAVING 短语作用于组,从中选择满足条件 的组。 实例: SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>=90;
连接查询
若一个查询同时涉及两个以上的表,则称之为连接查询。 连接查询包括等值连接查询、自然连接查询、非等值连接查询、自身连接查询、外连接查询和复合条件查询等。
等值与非等值连接查询
连接查询的 WHERE 子句中用来连接两个表的条件称为连接条件或连接谓词,其 一般格式为 [<表名 1>.]<列名 1><比较运算符>[<表名 2>.]<列名 2> 当连接运算符为=时,称为等值连接。使用其他运算符称为非等值连接。 连接谓词中的列名称为连接字段,连接条件中的各连接字段类型必须是可比的。 一条SQL语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件。 实例: SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno=SC.Sno; 解释: 关系数据库管理系统执行该连接操作的一种可能过程是:首先在表 Student 中找 到第一个元组,然后从头开始扫描 SC 表,逐一查找与 Student 第一个元组的 Sno 相等的 SC 元组,找到后就将 Student 中的第一个元组与该元组拼接起来,形成 结果表中一个元组。SC 全部查找完后,再找 Student 中第二个元组,然后再从 头开始扫描 SC,逐一查找满足连接条件的元组,找到后就将 Student 中的第二 个元组与该元组拼接起来,形成结果表中一个元组。重复上述操作,直到 Student 中的全部元组都处理完毕为止。这就是嵌套循环连接算法的基本思想。 若在等值连接中把目标列中重复的属性列去掉则为自然连接。
自身连接
连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为 表的自身连接连接。 自身连接需要给表起别名以示区别;由于所有属性名都是同名属性,因此必须使 用别名前缀。 
外连接
外连接即把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL)。 左外连接列出左边关系中所有的元组, 右外连接列出右边关系中所有的元组。
多表连接
连接操作除了可以是两表连接、一个表与其自身连接外, 还可以是两个以上的表进行连接,后者通常称为多表连接。 
嵌套查询
在 SQL 语言中,一个 SELECT-WHERE-FROM-语句称为一个查询块,将一个查询块嵌 套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为嵌套查询。 上 层的查询块称为外查询或父查询,下层查询块称为内层查询或子查询。 子查询的 SELECT 语句中不能使用 ORDER BY 子句, ORDER BY 子句只能对最终查询结果排序。 以层层嵌套的方式来构造程序正是SQL中结构化的含义所在。
带有IN谓词的子查询
在嵌套查询中,子查询的结果往往是一个集合。 实例:查询与“刘晨”在同一个系学习的学生。 SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='刘晨'); 子查询的查询条件不依赖于父查询,称为不相关子查询。一种求解方法是由里向 外处理,即先执行子查询,子查询的结果用于建立其父查询的查找条件。 有些嵌套查询可以用连接运算替代,如果子查询的查询条件依赖于父查询,这类 子查询称为相关子查询,整个查询语句称为相关嵌套查询语句。
带有比较运算符的子查询
带有比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用 户能确切知道内层查询返回的是单个值时,可以用>、<、=、>=、<=、! =或<>等比较运算符。 求解相关子查询不能像求解不想关子查询那样一次将子查询求解出来,然后求解父查询。 内层查询由于与外层查询有关,因此必须反复求值。 
带有ANY(SOME)或ALL谓词的子查询
子查询返回多值时要用ANY或ALL谓词修饰符,且必须同时使用比较运算符。 
带有EXISTS谓词的子查询
EXISTS 代表存在量词,带有 EXISTS 谓词的子查询不返回任何数据,只产生逻20 辑真值“true”或逻辑假值“false” 使用存在量词 EXISTS 后,若内层查询结果非空,则外层的 WHERE 子句返回真值, 否则返回假值。 使用存在量词 NOT EXISTS 后,若内层查询结果为空,则外层的 WHERE 子句返回 真值,否则返回假值。 由 EXISTS 引出的子查询,其目标查询式通常都用*,因为带有 EXISTS 谓词的子 查询只返回真值或假值,给出列名无实际意义。 SQL 中没有全称量词( for all),但是可以把带有全称量词的谓词转换为等价 带有存在量词的谓词。 
集合查询
集合操作主要包括并操作 UNION、交操作 TERSECT 和差操作 EXCEPT。注意,参 加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。 
基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象。 
数据更新
数据更新操作有三种:向表中添加若干行数据、修改表中的数据和删除表中的若干 行数据。在 SQL 中有相应的三类语句。
插入数据
SQL 的数据插入语句 INSERT 通常有两种形式,一种是插入一个元组,另一种是插 入子查询结果。后者可以一次插入多个元组。
插入元组
插入元组的INSERT语句的格式为 INSERT INTO <表名> [(<属性列 1> [,<属性列 2>]```)] VALUES (<常量 1>[,<常量 2>]```); 解释: 功能是将新元组插入指定表中,其中新元组的属性列1的值为常量1,属性列2的值为常量2。字符串常数要用单引号(英文)括起来。 INTO子句中没有出现的属性列,新元组在这些列上将取空值。 如果INTO子句中没有指明任何属性列名,则新插入的元组必须在每个属性列上均有值,且属性列的次序要与CREATE TABLE中的次序相同。
插入子查询结果
子查询嵌套在INSERT语句中用以生成要插入的批量数据。 格式: INSERT INTO <表名> [(<属性列 1> [,<属性列 2>```]) 子查询; 
修改数据
修改数据又称更新操作,一般格式为: UPDATA <表名> SET <列名>=<表达式> [,<列名>=<表达式>]``` [WHERE <条件>]; 解释: 修改指定表中满足WHERE子句条件的元组。其中SET子句给出<表达式>的值用于取代相应的属性列值。若忽略WHERE子句,则表示要修改表中的所有元组。 
删除数据
删除语句的一般格式: DELETE FROM <表名> [WHERE <条件>]; 解释: 功能是从指定表中删除满足WHERE子句条件的所有元组。若省略WHERE子句则表示删除表中全部元组,但表的定义仍在字典里。 即DELETE语句删除的是表中的数据,而不是关于表的定义。 
空值处理
所谓空值就是“不知道”或“不存在”或“无意义”的值。空值是一个很特殊的值,含有不确定性。SQL 语言中允许某些元 组的某些属性在一定情况下取空值。 一般有以下几种情况:该属性应该有一个值, 但目前不知道它的具体值; 该属性不应该有值;由于某种原因不便于填写。
空值的判断
判断一个属性的值是否为空值,用IS NULL或IS NOT NULL来表示。 
空值的约束条件
属性定义(或者域定义)中有NOT NULL约束条件的不能取空值,码属性不能取空值。
空值的算术运算、比较运算和逻辑运算
空值与另一个值(包括空值)的算术运算结果为空值。 空值与另一个值(包括空值)的比较运算的结果为UNKNOWN。有了 UNKNOWN 后, 传统的逻辑运算中二值逻辑就扩展成了三值逻辑。 在查询语句中,只有使WHERE和HAVING子句中的选择条件为TRUE的元组才被选出作为输出结果。
视图
视图是从一个或几个基本表(或视图)导出的表。 它与基本表不同,是一个虚表。 数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的 基本表中。 所以一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改 变了。 视图一经定义,就可以和基本表一样被查询、被删除。也可以在个视图之上 再定义新的视图,但对视图的新(增、删、改)操作则有一定的限制。
定义视图
建立视图
SQL语言用CREATE VIEW命令建立视图,其一般格式为 CREATE VIEW <视图名> [(<列名>[,<列名>]```)] AS <子查询> [WITH CHECK OPTION]; 解释: 子查询可以是任意的SELECT语句。 WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。 组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成。 关系数据库管理系统执行 CREATE VIEW 语句的结果只是把视图的定义存入数据 字典,并不执行其中的 SELECT 语句。只是在对视图查询时,才按视图的定义从 基本表中将数据查出。 若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列, 但保留了主码,则称这类视图为行列子集视图。 CREATE VIEWS 视图不仅可以建立在单个基本表上,也可以建立在多个基本表上。 视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义表的 属性列上,或建立在基本表与视图上。 带虚拟列的视图也称为带表达式的视图。 用带有聚集函数和GROUP BY子句的查询来定义视图,称为分组视图。 
删除视图
格式为: DROP VIEW <视图名> [CASCADE]; 视图删除后视图的定义将从数据字典中删除。如果该图上还导出了其他视图, 则使用 CASCADE 级联删除语句把该视图和由它导出的所有视图一起删除。 基本表删除后,由该基本表导出的所有视图均无法使用了,但是视图定义没有 从字典中清除。删除这些视图定义需要显式地使用 DROP VIEW 语句。
查询视图
视图定义后,用户就可以像对基本表一样对视图进行查询了。 关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及 的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的 子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了 的查询。这一换过程称为视图消解。 
更新视图
更新视图是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。 由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。(通过视图消解) 在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯 一地有意义地转换成对相应基本表的更新。一般地,行列子集视图是可更新的。 
视图的作用
(1)视图能够简化用户的操作 视图机制使用户可以将注意力集中在所关心的数据上。如果这些数据不是直接 来自基本表则可以通过定义视图使数据库看起来结构简单、清晰,并且可以简 化用户的数据查询操作。 (2)视图使用户能以多种角度看待同一数据 视图机制能使不同的用户以不同的方式看待同一数据,当许多不同种类的用户 共享同一个数据库时,这种灵活性是非常重要的。 (3)视图对重构数据库提供了一定程度的逻辑独立性 数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻 辑独立性是指当数据库重构造时,用户的应用程序不会受影响。 (4)视图能够对机密数据提供安全保护 有了视图机制,就可以在设计数据库应用系统时对不同的用户定义不同的视 图,使机密数据不出现在不应看到这些数据的用户视图上。这样视图机制就自 动提供了对机密数据的安全保护功能。 (5)适当利用视图可以更清晰地表达查询