关系数据库SQLlh.ppt

上传人:小飞机 文档编号:6553360 上传时间:2023-11-11 格式:PPT 页数:147 大小:1.28MB
返回 下载 相关 举报
关系数据库SQLlh.ppt_第1页
第1页 / 共147页
关系数据库SQLlh.ppt_第2页
第2页 / 共147页
关系数据库SQLlh.ppt_第3页
第3页 / 共147页
关系数据库SQLlh.ppt_第4页
第4页 / 共147页
关系数据库SQLlh.ppt_第5页
第5页 / 共147页
点击查看更多>>
资源描述

《关系数据库SQLlh.ppt》由会员分享,可在线阅读,更多相关《关系数据库SQLlh.ppt(147页珍藏版)》请在三一办公上搜索。

1、第 4 章 关系数据库标准语言SQL,4-1 SQL概述 4-2 数据定义 4-3 查询 4-4 数据更新 4-5 视图 4-6 数据控制,4-1 SQL概述,结构化查询语言SQL(Structured Query Language)是一种介于关系代数与关系演算之间的语言,其功能包括查询、操纵、定义和控制四个方面,是一个通用的、功能极强的关系数据库语言。目前已成为关系数据库的标准语言。,1.SQL 的特点:,(1)综合统一 非关系模型(层次模型、网状模型)的数据语言一般部分为模式数据定义语言(简称模式DDL)、外模式数据定义语言(简称外模式DDL或子模式DDL)、与数据存储有关的描述语言(简称

2、DSDL)及数据操纵语言(简称DML),分别用于定义模式、外模式、内模式和进行数据的存取与处置。当用户数据库投入运行后,如果需要修改模式,必须停止现有数据库的运行,转储数据,修改模式并编译后再重装数据库,十分麻烦。SQL语言集DDL、DML、DCL的于一体,包括定义关系模式、录入数据、建立数据库、查询、更新、维护、数据库重构、数据库安全性控制等一系列功能。,(2)非过程化 非关系数据模型的数据操纵语言是面向过程的语言,用其完成某项请求,必须指定存取路径。而用SQL语言进行数据操作,只要提出“做什么”,而用户无需了解存取路径,用户只需提出“做什么”,而不必指明“怎么做”。存取路径的选择以及SQL

3、语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。,(3)面向集合的操作方式 SQL语言采用集合操作方式,不仅查找结果可以是元组的集合。非关系数据模型采用的是面向记录的操作方式,操作对象是一条记录。例如查询所有平均成绩在80分以上的学生姓名,用户必须一条一条地把满足条件的学生记录找出来(通常要说明具体处理过程,即按照哪条路径,如何循环等)。而SQL语言采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。,(4)以同一种语法结构提供两种使用方式 SQL语言可采用交互式和嵌入式两种使用方式。SQL语言既是交

4、互式语言,又是嵌入式语言。作为交互式语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作;作为嵌入式语言,SQL语句能够嵌入到高级语言程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL语言的语法结构基本上是一致的。这种以统一的语法结构提供两种不同的使用方式的做法,提供了极大的灵活性与方便性。,(5)语言简洁 SQL语言功能极强,但由于设计巧妙,语言十分简授,完成核心功能只用了9个动词,如表所示。SQL语言接近英语口语,因此容易学习,容易使用。,2.SQL语言的基本概念,SQL语言支持关系数据库三级模式结构。外模式对应于视图和部分基本表,

5、模式对应于基本表,内模式对应于存储文件。模式:基本表是本身独立存在的表,在SQL中一个关系就对应一个表。内模式:一个存储文件中可有多个基本表。存储文件的逻辑结构组成了关系数据库的内模式。存储文件的物理文件结构是任意的。外模式:视图是从基本表或其他视图中导出的表,它不独立存储在数据库中,数据库只存放视图的定义,因此视图是一个虚表。,用户可以用SQL语言对视图和基本表进行查询。在用户眼中,视图和基本表都是关系,而存储文件对用户是透明的。下面将逐一介绍各SQL语句的功能和格式。为了突出基本概念和基本功能,忽略了许多语法细节。各个DBMS产品在实现标准SQL语言时也各有差别,一般都做了某种扩充。因此,

6、具体使用某个DBMs产品时,还应参阅系统提供的有关手册。,4-2 数据定义,SQL的数据定义功能包括定义表、定义视图和定义索引,如上表所示。,视图是基于基本表的虚表,索引是依附于基本表的,因此SQL通常不提供修改视图定义和修改索引定义的操作。用户如果想修改视图定义或索引定义,只能先将它们删除掉,然后再重建。不过有些关系数据库产品如Oracle允许直接修改视图定义。本节只介绍如何定义基本表和索引,视图的概念及其定义方法将在以后专门讨论。,1.定义基本表CREATE TABLE(列级完整性约束条件,列级完整性约束条件.),;,建表时可定义完整性约束条件,当用户操作表中数据时系统自动检查该操作是否违

7、背这些完整性约束条件。如果完整性约束条件涉及多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级。定义表的各个属性时需要指明其数据类型及长度。不同的数据库系统支持为数据类型不完全相同,例如IBM DB2 SQL主要文持以下等数据类型:,例1 建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成,其中学号属性不能为空,并且其值是唯一的。CREATE TABLE Student Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(20),Ssex CHAR(1),Sage INT,Sdep

8、t CHAR(15);列级完整性约束条件,Sno取值唯,不许取空值,2.修改基本表ALTER TABLE ADD 完整性约束 DROP MODIFY;ADD子句用于增加新列和新的完整性约束条件,DROP子句用于删除指定的完整性约束条件,MODIFY子句用于修改原有的列定义。,例2 向Student表增加“入学时间”列,数据类型为日期型。ALTER TABLE Student ADD Scome DATE;不论基本表中原来是否已有数据,新增加的列一律为空值。例3 将年龄的数据类型改为半字长整数。ALTER TABLE student MODIFY Sage MALLINT;修改原有的列定义有可能

9、会破坏已有数据。例4 删除学生姓名的唯一值的约束。ALTER TABLE Student Drop UNIQUE(Sname);,3.删除基本表 DROP TABLE 例5 删除Student表 DROP TABLE Student 基本表定义一旦删除,表中的数据、在此表上建立的索引都将自动被删除掉,而建立在此表上的视图虽仍然保留,但已无法引用。,4.建立索引 建立索引是加快查询速度的有效手段。用户可以根据应用环境的需要,在基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。系统在存取数据时会自动选择合适的索引作为存取路径,用户不必也不能选择索引。CREATE UNIQUE CLUS

10、TER INDEX ON(,.);,索引可以建在表的一列或多列上。可在每个后面指定索引值的排列次序。ASC表示升序,DESC表示降序,缺省值为ASC。UNIQUE表明建唯一性索引。表明此索引的每一个索引值只对应唯一的数据记录。CLUSTER表示建聚簇索引。所谓聚簇索引是指索引项的顺序与表中记录的物理顺序一致的索引。,CREATE CLUSTER INDEX Stusname ON Student(sname);将会在student表的sname(姓名)列上建立一个聚族索引,而且student表中的记录将按照sname值的升序存放。用户可以在最常查询的列上建立聚簇索引以提高查询效率。显然在一个基

11、本表上最多只能建立一个聚簇索引。建立聚族索引后,更新索引列数据时,往往导致表中记录的物理顺序的变更,代价较大,因此对于经常更新的列不宜建立聚簇索引。,例6 为学生课程数据库中的Student,Couse,Sc三个表建立索引中Student表按学号升序建唯一索引,Couse按课程号升序建唯一索引,SC表按学号升序和课程号降序建唯一索引。CREATE UNIQUE INDEX Stusno ON student(Sno);CREATE UNIQUE INDEX Coucno ON Couse(Cno);CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC)

12、;,5.删除索引 DROP INDEX;例7 删除Student表的Stusname索引 DROP INDEX Stusname;索引一经建立,就由系统使用和维护它,不需用户干预。删除索引时,系统会同时从数据字典中删去有关该索引的描述。,4-3 查询,SELECT ALL|DISTINCT,FROM,.WHERE GROUP BY HAVING ORDER BY ASC|DESC;,SELECT语句的含义:根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。如果有GROUP子句,则将结果按的值

13、进行分组,该属性列值相等的元组为一个组,每个组产生结果表中的一条记录。如果GROUP子句带HAVING短语,则只有满足指定条件的组才予输出。,一.单表查询,(1)查询指定列 例1 查询全体学生的学号与姓名 SELECT Sno,Sname FROM Student;(2)查询全部列 例3 查询全体学生的详细记录 SELECT*FROM Student;,例6 查所有选修过课的学生的学号 SELECT Sno FROM SC;假设SC表中有下列数据 Sno Cno Grade-95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80,(3)消除

14、取值重复的行指定DISTINCT可掉重复行:SELECT DISTINCT Sno FROM SC;结果为:Sno-95001 95002,(4)查询满足条件的元组 查询满足指定条件的元组可以通过WHERE子句实现。WHERE子句常用的查询条件如表。,例9 查考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM Course WHERE Grade 60;例12 查信息系(IS)、数学系(MA)和计算机科学系(CS)的学生的姓名和性别 SELECT Sname,Ssex FROM Student WHERE Sdept IN(IS,MA,CS);,谓词LIKE可用来进

15、行字符串的匹配。其语法格式如下:NOT LIKE ESCAPE 其含义是查找指定的属性列值与相匹配的元组。可以是一个完整的字符串,也可以含有通配符%和_。%(百分号)代表任意长度(长度可以为0)的字符串。_(下横线)代表任意单个字符。,例14 查所有姓刘的学生的姓名、学号和性别 SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE 刘%;如果用户要查询的匹配字符串本身就含有%或 _,这时就要使用 ESCAPE 短语对通配符进行转义了。例15 查 DB_Design 课程的课程号和学分 SELECT Cno,Ccredit FROM Course

16、 WHERE Cname LIKE DB_Design ESCAPE;,ESCAPE 短语表示 为换码字符,这样匹配串中紧跟在 后面的字符”_”不再具有通配符的含义,而是取其本身含义,被转义为普通的”_”字符。,(5)对查询结果排序 例23 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列 SELECT Sno,Grade FROM SC WHERE Cno=3 ORDER BY Grade DESC;,(6)使用集函数 COUNT(DISTINCT|ALL*)统计元组个数 COUNT(DISTINCT|ALL)统计一列中值的个数 SUM(DISTINCT|ALL)计算一列值的

17、总和 AVG(DISTINCT|ALL)计算一列值的平均值 MAX(DISTINCT|ALL)求一列值中的最大值 MIN(DISTINCT|ALL)求一列值中的最小值,例28 查询学习1号课程的学生最高分数 SELECT MAX(Grade)FROM SC WHERE Cno=1;,(7)对查询结果分组 GROUP BY子句可以将查询结果表的各行按一列或多列,将值相等的作为一组。例29 查询各个课程号与相应的选课人数 SELECT Cno,COUNT(Sno)FROM SC GROUP BY Cno;该SELECT语句对SC表按Cno的取值进行分组,所有具有相同Cno值的元组为一组,然后对每一

18、组作用集函数COUNT以求得该组的学生人数。查询结果为:,Cno COUNT(Sno)1 22 2 34 3 44 如果分组后还要求按一定的条件对这些组进行筛选条,最终只输出满足指定的组,则可以使用HAVING短语指定筛选条件。,例31 查询选修了3门以上课程的学生学号。SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)3;这里先用GROPU BY子句按Sno进行分组,再用集函数COUNT对每一组计数。HAVING短语指定选择组的条件,只有满足条件的组才会被选出来。WHERE子句与HAVING短语的区别在于作用对象不同。WHERE子句作用于基本表或视

19、图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。,二、连接查询,若一个查询同时涉及两个以上的表,则称之为连接查询。什么时候使用连接查询?当要查询数据存在于多个表中连接查询主要包括:等值连接非等值连接查询自身连接查询(自身连接)外连接查询(外连接)复合条件连接查询(复合条件连接),例如对于下列两表student、SC,查询每个学生基本信息及其选课的情况:,Student,SC,连接条件当查询涉及数据库中的多个表时,必须按照一定条件将这些表连接在一起。用于连接两个表的条件,称为连接条件。连接条件应在SELECT语句中的Where子句中给出连接条件的一般格式:.注意:连接

20、条件中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的。其中比较运算符主要有:=、=、.BETWEEN.AND.,(1)等值与非等值连接查询 当连接运算符为=时,称为等值连接。使用其它运算符称为非等值连接。DBMS执行连接操作的过程:首先在表1中找到第一个元组,然后从头开始顺序扫描表2,查找满足连接条件的元组,每找到一个元组,就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。表2全部扫描完毕后,再到表1中找第二个元组,然后再从头开始顺序扫描表2,查找满足连接条件的元组,每找到一个元组,就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。,例如:查询学生的基本信息

21、及选课信息,学生信息在Student表中,学生选课信息在SC表中,所以本查询实际上同时涉及Student与SC两个表中的数据。这两个表之间的联系是通过两个表都具有的属性Sno实现的。要查询学生及其选修课程的情况,就必须将这两个表中学号相同的元组连接起来。这是一个等值连接。完成本查询的SQL语句为:SELECT Student.*,SC.*FROM Student,SC WHERE Student.Sno=SC.Sno;,Student,SC,连接过程,student scStudent.sno sname Ssex Sage Sdept sc.Sno cno Grade,95001 李勇 男

22、20 CS,95001 1 92,95001 李勇 男 20 CS,95001 2 85,95001 李勇 男 20 CS,95001 3 88,95002 刘晨 女 19 IS,95002 2 90,95002 刘晨 女 19 IS,95002 3 80,95003 王名 女 18 MA,95004 张立 男 18 IS,SELECT Student.*,SC.*FROM Student,SC WHERE Student.Sno=SC.Sno;执行结果:,练习:对于下列两个表图书(book),作者(author),查询每本图书的图书编号(bookID),书名(bookname),作者姓名(n

23、ame),作者的地址(address).,book,author,(2)自身连接 连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,这种连接称为表的自身连接。,例34 查询每一门课的间接先修课(即先修课的先修课)分析:在“课程”表中只有课程的直接先修课,没有间接先修课,要得到这个信息,必须先查找每门课程的先修课,再按此先修课的课程号,在“课程”表查找该门课程的先修课。相当于将Course按照Cno和Cpno连接后,查找第一个副本的课程号和第二个副本的先修课程号。,为清楚起见,可以为Course表取两个别名,一个是FIRST,另一个是SECOND。,完成该查询的SQL语句为:SE

24、LECT FIRST.Cno,SECOND.Pcno FROM Course FIRST,Course SECOND WHERE FIRST.Pcno=SECOND.Cno;结果表如下:Cno Pcno,(3)外连接 通常的连接操作中,只有满足连接条件的元组才能作为结果输出。例如:我们想以 Student 表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况信息,其选课信息为空值即可,这时就需要使用外连接(Outer Join)。外连接的运算符通常为*。有的关系数据库中也用+。SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno

25、,Grade FROM Student,SC WHERE Student.Sno=SC.Sno(*);,Student.sno sname Ssex Sage Sdept cno Grade,95001 李勇 男 20 CS,1 92,95001 李勇 男 20 CS,2 85,95001 李勇 男 20 CS,3 88,95002 刘晨 女 19 IS,2 90,95002 刘晨 女 19 IS,3 80,95003 王名 女 18 MA,95004 张立 男 18 IS,(不使用外连接时),查询结果(使用外连接),(4)复合条件连接Where子句中有多个条件的连接操作,称为复合条件连接例:

26、查询选修2号课程且成绩在90分以上的学生的姓名(Sname)、学号(Sno)、成绩(grade).Select student.sno,name,gradeFrom student,ScWhere Student.sno=SC.sno And o=2 And sc.grade=90;,多表连接两个以上的表进行连接例:查询每个学生的学号(sno)、姓名(sname)、选修的课程名(cname)、成绩(grade)。Select student.sno,sname,cname,gradeFrom student,sc,courseWhere Student.sno=Sc.Sno And So=Co

27、;,练习1:查询成绩大于80分学生的学号(Sno)、姓名(Sname)、性别(Ssex)、选修课程号(Cno),成绩(Grade).,练习2:查询“数据库”系列图书的图书编号、书名、出版社、作者姓名、作者电话、年龄。,book,author,三、嵌套查询,查询块:在SQL语言中,一个SELECT FROM WHERE语句称为个查询块。嵌套查询将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语条件中的查询称为嵌套查询。什么时候使用嵌套查询?当需要用一个查询的结果构成另一个查询的条件时,例如:查询所有选修了2号课程的学生的姓名。SELECT Sname FROM Student WH

28、ERE Sno IN(SELECT Sno FROM SC WHERE Cno2);下层查询块SELECT Sno FROM SC WHERE Cno2是嵌套在上层查询块where条件中的。,SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其它子查询。注意:子查询的SELECT语句中不能使用ORDER BY于句,ORDER BY子句只能对最终查询结果排序。嵌套查询一般的求解方法是由里向外处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。嵌套查询使我们可以用多个简单查询构成复杂的查询,从而增强SQL的查询能力。以层层嵌套的方式来构造程序正是SQL结构化的意义

29、所在。,1、带有IN谓词的子查询 带有谓词IN的子查询是指父查询与子查询间用IN进行连接,判断某个属性列的值是否在查询的结果中。在嵌套查询中,子查询的结果往往是个集合,所以谓词IN是嵌套查询中最经常使用的谓词。,练习1:查询所有选修了1号课程且成绩大于80分的学生的学号、姓名。练习2:查询所有地址在“北京”的作者所著的书名、出版社。,book,author,2、带有比较运算符的子查询 带有比较运算符的子查询是指父查询与子查向之间用比较运算符进行连接。当用户能确切知道内层查询返回的是单值时,可以用,=,等比较运算符。,3、带有ANY或ALL谓词的子查询 使用ANY或ALL谓词时则必须同时使用比较

30、运算符。共语义为:,ANY、ALL谓词与集函数及IN等谓词的转换关系,练习:查询“IS”系所有学生的学号、成绩练习:查询比“IS”系任何一名同学成绩低的、其它专业的同学的学号、成绩。,4-4 数据更新,SQL中数据更新包括插入数据、修改数据和删除数据。一、插入语句 SQL的数据插入语句Insert通常有两种形式。一种是插入一个元组,另一种是插入子查询结果。后者可以一次插入多个元组。插入单个元组的INSERT语句的格式为:INSERT INTO 表名(列名1,列名2,)VALUES(常量1,常量2,);,其功能是将新元组插入指定表中。其中新记录列1的值为常量1,列2的值为常量2,。Into子句中

31、没有出现的属性列,新记录在这些列上将取空值。注意:在表定义时说明了NOT NULL的属性列不能取空值。如果INTO子句没有指明任何列名,则新插入的记录必须在每个属性列上均有值。,插入子查询结果:子查询不仅可以嵌套在SELECT语句中,用以构造父查询的条件,也可以嵌套在INSERT语句中,用以生成要插入的批量数据。插入子查询结果的INSERT语句的格式为:INSERT INTO 表名(列1,列2,)子查询;,二、修改语句,修改操作语句的一般格式为:UPDATE 表名,SET 列名表达式,列名表达式 WHERE;功能是修改指定表中满足WHERE子句条件的元组。其中SET子句给出表达式的值用于取代相

32、应的属性列值。如果省略WHERE子句,则表示要修改表中的所有元组。,1、修改某一个元组的值 例4 将学生95001的年龄改为22岁。UPDATE Student SET Sage=22 WHERE Sno=95001;2、修改多个元组的值 例5 将所有学生的年龄增加1岁 UPDATE Student SET Sage=Sage+1;,3、带子查询的修改语句 子查询也可以嵌套在UPDATE语句中,用以构造修改的条件。,试一下用IN来构造条件子句,三、删除数据,删除语句的一般格式为:DELETE FROM WHERE;DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组如果省略W

33、HERE子句,表示删除表中全部元组,但表的定义仍在字典。DELETE语句删除的是表中的数据,而不是关于表的定义。,1、删除某一个元组的值例7 删除学号为95019的学生记录 DELETE FROM Student WHERE Sno=95019;2、删除多个元组的值例8 删除所有的学生选课记录。DELETE FRDM SC;这条DELETE语句将SC成为空表,它删除了SC的所有元组.,3、带子查询的删除语句 子查询同样也可以嵌套在DELETE语句中,用以构造执行删除操作的条件。,四、更新操作与数据库的一致性,增删改操作只对一个表操作。这会带来一些问题。比如95019学生被删除后,有关其选课信息

34、也应同时删除,而这只能通过两条语句进行。,第1条语句删除95019学生;DELETE FROM Student WHERE Sno=95019;第2条语句删除95019学生的选课记录 DELETE FROM SC WHERE Sno95019;,在执行了第1条DELETE语句之后,数据库中的数据己处于不一致状态,因为这时实际上己没有学号为95019的学生了,但SC表中仍然记录着关于95019学生的选课信息,即数据的参照完整性受到破坏。只有执行了第2条DELETE语句之后,数据才重新处于一致状态。但如果执行完一条语句之后,机器突然出现故障,无法再继续执行第2条UPDATE语句,则数据库中的数据将

35、永远处于不一致状态。因此必须保证这两条语句要么都做,要么都不做。,为解决这一问题,数据库系统通常都引入了事务(Transmation)的概念,将在以后介绍。在“关系的完整性”中已讲到,实体完整性和参照完整性是关系模型必须满足的完整性约束条件,应该由关系系统自动支持。当向参照表中插入元组,如往SC中插入选课记录(95020,1),系统将自动地检查被参照表student和course中是否存在相应的元组(95020号学生的记录,1号课程的记录),如果都存在则操作成功,否则操作失败。,当删除主表中的元组(如学生95019),可以有以下的策略:(1)系统自动地删除参照表(如sc)中相应的元组(学生95

36、019的选课记录)。(2)系统检查参照表中是否存在相应的元组,如果存在,则操作失败。各种数据库产品提供了不同的实现策略。,4-5 视 图,视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。,视图一经定义,就可以和基本表一样被查询、被删除,我们也可以在一个视图之上再定义新的视图,但对

37、视图的更新(增加、删除、修改)操作则有一定的限制。本节专门讨论视图的定义、操作及优点。,一、定义视图,1、建立视图 SQL语言用CREATE VIEW命令建立视图,其一般格式为CREATE VIEW(,)AS WITH CHECK OPTION;其中子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY子句和DISTINCT短语。,WITH CHECK OPTION表示对视图进行UPDATE,INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。视图的列名可以全部省略该视图是子查询中由SELECT子句目标列中的字段组成全

38、部指定,但在下列三种情况下必须明确指定组成视图的所有列名:(1)某个目标列不是单纯的属性名,而是集函数或列表达式(2)多表连接时选出了几个同名列作为视图的字段(3)需要在视图中为某个列启用新的更合适的名字,DBMS执行CREATE VIEW语句的结果只是把视图的定义存入数据字典,并不执行其中的SELECT语句。只是在对视图查询时,才按照视图的定义从基本表中将数据查出。,由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,DBMS会自动加上SdeptlS条件。,由于视图IS_S1的属性列中包含了Student表与SC表的同名列

39、sno,所以必须在视图名后明确说明视图的各个属性列名,,视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上。,若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了码,我们称这类视图为行列子集视图。IS_Student视图就是一个行列子集视图。,定义基本表时为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。但由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列。这些派生属性由于在基本表中并不实际存在也称它们为虚拟列。带虚拟列的视图也称为带表达式

40、的视图。例5 定义一个反映学生出生年份的视图。CREATE V1EW BT_S(Sno,Sname,Sbirth)AS SELECT Sno,Sname,2003-Sage FROM Student;还可以用带有集函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图。,由于AS子句中SELECT语句的目标列平均成绩是通过作用集函数得到的,所以CREATE VIEW中必须明确定义组成S_G视图的各个属性列名,S_G是个分组视图。,这里视图F_Student是由于查询“SELECT*”建立的。如果以后修改了基本表Student的结构,则Studentt表与F_Student视图的映象关

41、系被破坏,因而该视图就不能正确工作了。为避免出现这类问题,最好在修改基本表之后删除由该基本表导出的视图,然后重建(同名)视图。,2、删除视图该语句的格式为:DROP VIEW;视图删除后视图的定义将从数据字典中删除。但是由该视图导出的其他视图定义仍在数据字典中,不过该视图已失效。用户使用时会出错,要用DROP VIEW语句将它们一一删除。就像基本表删除后,由该基本表导出的所有视图(定义)没有被删除,但均己无法使用了。删除这些视图(定义)需要显式地使用DROP VIEW语句。,例8 删除视图IS_S1 DROP VIEW IS_S1;执行此语句后,IS_S1视图的定义将从数据字典中删除。由IS_

42、S1视图导出IS_S2视图的定义虽然仍在数据字典中,但是该视图已无法使用了,因此应该同时删除。,二、查询视图,视图定义后,用户就可以象对基本表一样对视图进行查询了。DBMS执行对视图的查询时,首先进行有效性检查,检查查询的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解。,本查询涉及虚表cs_student和基本表SC,通过这两个表的连接来完成用户请求。,在一般情况下,视图查询的转换是直接了当的。但有些情况下,这种转换不能直接进行,查询时就会出现问题。如:,将上面查询语

43、句与子查询结合后,形成下列查询语句:SELECT Sno,AVG(Grade)FROM SCWHERE AVG(Grade)90GROUP BY Sno;前面讲过WHERE子句中是不能用集函数作为条件表达式的,因此执行此修正后的查询将会出现语法错误。正确的查询语句应该是:,三、更新视图,更新视图是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。由于视图是不实际存储数据的虚表,因此对视图的更新,最终要转换为对基本表的更新。为防止用户通过视图对数据进行增加、删除、修改时,有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OP

44、TION子句。这样在视图上增删改数据时,DBMS会检查视图定义中的条件,若不满足条件,则拒绝执行该操作。,例2 向信息系学生视图IS_Student中插入一个新的学生记录,其中学号为95029,姓名为赵新,年龄为20岁。INSERT INTO IS_Student VALUES(95029,赵新,20);转换为对基本表的更新:INSERT INTO Student(Sno,Sname,Sage,Sdept)VALUES(95029,赵新,20,IS);,在关系数据库中,并不是所有的视图都是可更新的,因为有些视图的更新不能唯一地有意义地转换成对相应基本表的更新。,例如前面定义的视图S_G是由“学

45、号”和“平均成绩”两个属性列组成的,其中平均成绩一项是由SC表中对元组分组后计算平均值得来的。如果我们想把视图S_G中学号为95001的学生的平均成绩改成90分,SQL语句如下:UPDATE S_G SET Gavg=90 WHERE Sno95001;但这个对视图的更新是无法转换成对基本表SC的更新的,因为系统无法修改各科成绩,使平均成绩成为90。所以S_G视图是不可更新的。,一般地,行列子集视图是可更新的。目前各个关系数据库系统一般都只允许对行列子集视图进行更新,而从各个系统对视图的更新还有更进一步的规定,由于各系统实现方法上的差异,这些规定也不尽相同。例如DB2规定:(1)若视图是内两个

46、以上基本表导出的,则此视图不允许更新。(2)若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但允许执行DELETE操作。(3)若视图的字段来自集函数,则此视图不允许更新。,(4)若视图定义中含有GROUP BY子句,则此视图不允许更新*(5)若视图定义中含有DISTINCT短语,则此视图不允许更新。(6)若视图定义中有嵌套查询,并且内层查询的FROM子句中涉及的表也是导出该视图的基本表,则此视图不允许更新。(7)一个不允许更新的视图上定义的视图也不允许更新。,四、视图的作用,视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。而对于

47、非行列子集视图进行查询或更新时还有可能出现问题。既然如此,为什么还要定义视图呢?这是因为合理使用视图能够带来许多好处。1、视图能够简化用户的操作 视图机制使用户可以将注意力集中在所关心的数据上。如果这些数据不是直接来自基本表,则可以通过定义视图,使数据库看起来结构简单、清晰,并且可以简化用户的数据查询操体。例如,那些定义了若干张表连接的视图,就将表与表之间的连接操作对用户隐蔽起来了。换句话说,用户所做的只是对个虚表的简单查询,而这个虚表是怎样得来的,用户无需了解。,2、视图使用户能以多种角度看待同一数据 视图机制能使不同的用户以不同的方式看待同一数据、当许多用户共享同一个数据库时,这种灵活性是

48、非常重要的。3、视图对重构数据库提供了一定程度的逻辑独立性 第一章中已经介绍过数据购物理独立性与逻辑独立性的概念。数据的物理独立性是指用户和用户程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户和用户程序不会受影响。层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全地支持。,这样尽管数据库的逻辑结构改变了,但应用程序不必修改,因为新建立的视图定义了用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。当然,视图只能在一定程度上提供数据的逻辑独立性,比如由于对视图的更新是有条

49、件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而改变。4、视图能够对机密数据提供安全保护 有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应看到这些数据的用户视图上,这样视图机制就自动提供了时机密数据的安全保护功能。例如Student表涉及三个系的学生数据,可以在其上定义三个视图每个视图只包含一个系的学生数据,并只允许每个系的系主仅查询自己系的学生视图。,4-6 数据控制,由DBMS提供统一的数据控制功能是数据库系统的特点之一。SQL中数据控制功能包括:事务管理功能和数据保护功能,即:数据库的恢复并发控制;数据库的安全性完整性控制。SQ

50、L语言定义完整性约束条件的功能主要体现在 CREATE TABLE语句和ALTER TABLE中,可以在这些语句中定义码、取值唯一的列、不允许空值的列、外码(参照完整性)及其他一些约束条件。SQL语言也提供了并发控制及恢复的功能,支持事务、提交、回滚等概念,SQL语言在这方面的能力将在后面章节做进一步介绍。这里主要讨论SQL语言的安全性控制功能。,数据库的安全性是指保护数据库,防止不合法的使用所造成数据泄漏和破坏。数据库系统中保证数据安全性的主要措施是进行存取控制,即规定不同的用户对于不同数据对象所允许执行的操作,并控制各用户只能存取他有权存取的数据。DBMS必须具有以下功能:把授权的决定告知

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号