《学习与管饭的我的笔记.ppt》由会员分享,可在线阅读,更多相关《学习与管饭的我的笔记.ppt(37页珍藏版)》请在三一文库上搜索。
1、视图的概念,视图是从一个或多个表(或视图)导出的虚拟表。视图是数据库的用户使用数据库的观点。 视图与表(有时为与视图区别,也称表为基本表Base Table)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。,使用视图的优点,提供最新的数据。 具有更好的安全性,有利于提高数据库逻辑独立性。 针对性强。,建立视图的四种类型,表中列的子集 表中行的子集 两个或多个表的连接 聚集信息,使用视图的一些限制,列数不能超过1024列。 不能跨数据库引用列。 只能访问视图定义所涉及到的列。 通过视图操纵数据
2、时不能违背建立表时所建立的约束。 视图最多嵌套32层。 定义视图时不能使用ORDER BY语句。,建立视图,用CREATE VIEW语句创建 用企业管理器创建 使用视图向导创建,CREATE VIEW语句,CREATE VIEW ( ,) AS WITH CHECK OPTION/*透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式)*/,说明,DBMS执行CREATE VIEW语句时只是把视图的定义存入数据字典,并不执行其中的SELECT语句。 在对视图查询时,按视图的定义从基本表中将数据查出。,组成视图的属性列名,省略全部列:由子查询中SELECT目标列中的诸字
3、段组成。 明确指定视图的所有列名: 某个目标列是集函数或列表达式 目标列为 * 多表连接时选出了几个同名列作为视图的字段 需要在视图中为某个列启用新的更合适的名字,行列子集视图,例 建立信息系学生的视图。 CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= IS; 从单个基本表导出,只是去掉了基本表的某些行和某些列,保留了码。,WITH CHECK OPTION的视图,例2 建立信息系学生的视图,并要求透过该视图进行的更新操作只涉及信息系学生。 CREATE VIEW IS_Student AS S
4、ELECT Sno,Sname,Sage FROM Student WHERE Sdept= IS WITH CHECK OPTION;,对IS_Student视图的更新操作,修改操作:DBMS自动加上Sdept= IS的条件 删除操作:DBMS自动加上Sdept= IS的条件 插入操作:DBMS自动检查Sdept属性值是否为IS 如果不是,则拒绝该插入操作 如果没有提供Sdept属性值,则自动定义Sdept为IS,建立视图(续),例7 将学生的学号及他的平均成绩定义为一个视图,假设SC表中“成绩”列Grade为数字型 CREAT VIEW S_G(Sno,Gavg) AS SELECT Sn
5、o,AVG(Grade) FROM SC GROUP BY Sno,建立视图(回顾),行列子集视图 WITH CHECK OPTION的视图 基于多个基表的视图 基于视图的视图 带表达式的视图 分组视图 注: 视图是虚表,是导出的表 以 SELECT * 方式创建的视图可扩充性差,应尽可能避免,视图的修改与删除,ALTER VIEW () AS WITH CHECK OPTION DROP VIEW ,视图的查询,从用户角度:查询视图与查询基本表相同 DBMS实现视图查询的方法: 实体化视图(View Materialization) 有效性检查:检查所查询的视图是否存在 执行视图定义,将视图
6、临时实体化,生成临时表 查询视图转换为查询临时表 查询完毕删除被实体化的视图(临时表),视图的查询,视图消解法(View Resolution) 进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义 把视图定义中的子查询与用户的查询结合起来,转换成等价的对基本表的查询 执行修正后的查询,查询视图(续),例 在信息系学生的视图中找出年龄小于20岁的学生。 SELECT Sno,Sage FROM IS_Student WHERE Sage20; IS_Student视图的定义 (视图定义例1): CREATE VIEW IS_Student AS SELECT S
7、no,Sname,Sage FROM Student WHERE Sdept= IS;,视图的查询(续),视图实体化法 视图消解法 转换后的查询语句为: SELECT Sno,Sage FROM Student WHERE Sdept= IS AND Sage20;,查询视图(续),视图消解法的局限 有些情况下,视图消解法不能生成正确查询。采用视图消解法的DBMS会限制这类查询。,查询视图(续),例3在S_G视图中查询平均成绩在90分以上的学生学号和平均成绩 SELECT * FROM S_G WHERE Gavg=90; S_G视图定义: CREATE VIEW S_G (Sno,Gavg)
8、 AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;,查询转换,错误: SELECT Sno,AVG(Grade) FROM SC WHERE AVG(Grade)=90 GROUP BY Sno; 正确: SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)=90; 注:目前大多RDBMS不能正确转换,但一般行列子集视图的查询均能正确转换,更新视图,用户角度:更新视图与更新基本表相同 DBMS实现视图更新的方法 视图实体化法(View Materialization) 视图消解法(V
9、iew Resolution) 指定WITH CHECK OPTION子句后 DBMS在更新视图时会进行检查,防止用户通过视图对不属于视图范围内的基本表数据进行更新,更新视图(续),例1 将信息系学生视图IS_Student中学号95002的学生姓名改为“刘辰”。 UPDATE IS_Student SET Sname= 刘辰 WHERE Sno= 95002; 转换后的语句: UPDATE Student SET Sname= 刘辰 WHERE Sno= 95002 AND Sdept= IS;,更新视图(续),例2 向信息系学生视图IS_S中插入一个新的学生记录:95029,赵新,20岁
10、INSERT INTO IS_Student VALUES(95029,赵新,20); 转换为对基本表的更新: INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES(95029,赵新,20,IS );,更新视图(续),例3 删除视图CS_S中学号为95029的记录 DELETE FROM IS_Student WHERE Sno= 95029; 转换为对基本表的更新: DELETE FROM Student WHERE Sno= 95029 AND Sdept= IS;,更新视图的限制,一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换
11、成对相应基本表的更新(对两类方法均如此) 例:视图S_G为不可更新视图。 CREATE VIEW S_G (Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;,更新视图(续),对于如下更新语句: UPDATE S_G SET Gavg=90 WHERE Sno= 95001; 无论实体化法还是消解法都无法将其转换成对基本表SC的更新,可更新视图条件,满足以下条件的视图:创建视图的select语句中没有聚合函数,且没有top,group by,union子句及distinct关键字;创建的select语句中不包含从基本表通过计算所得的
12、列;创建视图的select语句的from子句中至少要包含一个基本表。 可更新的分区视图。 通过instead of触发器创建的可更新视图。,建立与删除索引,建立索引是加快查询速度的有效手段 建立索引 DBA或表的属主(即建立表的人)根据需要建立 有些DBMS自动建立以下列上的索引 PRIMARY KEY UNIQUE 维护索引 DBMS自动完成 使用索引 DBMS自动选择是否使用索引以及使用哪些索引,建立索引的作用,快速存取数据 保证数据记录的惟一性 实现表与表之间的参照完整性 在使用order by,group by子句进行数据检索时,利用索引可以减少排序和分组的时间。,索引的分类,聚集索引
13、 将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致。 非聚集索引 完全独立于数据行的结构。 两类都是按B树组织索引的,但聚集索引B树的叶结点存放数据页信息,是按索引键的次序存储的,因此对查找记录很有效;而非聚集索引B树的叶结点不存放数据页信息,而存放非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。,建立索引,CREATE UNIQUE CLUSTER INDEX ON (, ); 用指定要建索引的基本表名字 索引可以建立在该表的一列或多列上,各列名之间用逗号分隔 用指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC UNIQUE表明
14、此索引的每一个索引值只对应唯一的数据记录 CLUSTER表示要建立的索引是聚簇索引,例题,例为学生-课程数据库中的Student,Course,SC三个表建立索引。其中Student表按学号升序建唯一索引,Course表按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。 CREATE UNIQUE INDEX Stusno ON Student(Sno); CREATE UNIQUE INDEX Coucno ON Course(Cno); CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);,建立索引 (续),唯一值索引 对于已含重
15、复值的属性列不能建UNIQUE索引 对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束,建立索引 (续),聚簇索引:建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致 CREATE CLUSTER INDEX Stusname ON Student(Sname); 在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放,建立索引 (续),在一个基本表上最多只能建立一个聚簇索引 聚簇索引的用途:对于某些类型的查询,可以提高查询效率 聚簇索引的适用范围 很少对基表进行增删操作 很少对其中的变长列进行修改操作,删除索引,DROP INDEX ; 删除索引时,系统会从数据字典中删去有关该索引的描述。 例删除Student表的Stusname索引。 DROP INDEX Stusname;,
链接地址:https://www.31doc.com/p-3406857.html