《数据库原理第三讲.ppt》由会员分享,可在线阅读,更多相关《数据库原理第三讲.ppt(151页珍藏版)》请在三一办公上搜索。
1、数据库原理及应用教案,计算机科学学院,第3章 数据库的标准语言SQL,3.1 SQL概述3.2 数据定义3.3 数据查询3.4 数据更新3.5 SQL的完整性控制3.6 SQL中的触发器3.7 嵌入式SQL,第3章 数据库的标准语言SQL,SQL(Structrued Query Language)早已确立自己作为关系数据库标准语言的地位,已被众多商用 DBMS 产品所采用,使得它已成为关系数据库领域中一个主流语言。它不仅包含了数据查询功能,还包括插入、删除、更新和数据定义功能。作为一个 SQL数据库是表的汇集,它用一个或多个 SQL模式定义。作为 SQL的用户可以是应用程序,也可以是终端用户
2、。,31 SQL概述,SQL语句的特征尽管人们习惯性地称SQL是一个“查询语言”,但实际上,它的功能远非查询信息这么简单。主要包括:数据查询(Query)数据操纵(Manipulation)数据定义(Definition)数据控制(Control),1SQL的特点,(1)综合统一(2)高度非过程化(3)面向集合的操作方式(4)二种使用方式(5)语言简洁、易学易用,1SQL的特点,SQL 语言功能极强,完成核心功能只用了9个动词,包括如下四类:数据查询:SELECT数据定义:CREATE、DROP、ALTER数据操纵:INSERT、UODATE、DELETE数据控制:GRANT、REVORK。,
3、SQL语言支持关系数据库的三级模式结构,其中:视图对应外模式基本表对应模式存储文件对应内模式具体结构如图3-1所示。,2SQL支持三级模式结构,3.1.2 SQL的基本组成,SQL由以下几个部分组成:(1)数据定义语言(DDL):提供定义关系模式和视图、删除关系和视图、修改关系模式的命令。(2)交互式数据操纵语言(DML):提供查询、插入、删除和修改的命令。(3)事务控制(transaction control):SQL提供定义事务开始和结束的命令。,SQL组成部分,(4)嵌入式SQL和动态SQL(embedded SQL and dynamic SQL)用于嵌入到某种通用的高级语言中混合编程
4、。其中 SQL 负责操纵数据库,高级语言负责控制程序流程。(5)完整性(integrity):SQL DDL 包括定义数据库中的数据必须满足的完整性约束条件的命令,对于破坏完整性约束条件的更新将被禁止。(6)权限管理(authorization):SQL DDL中包括说明对关系和视图的访问权限。,32 数据定义,基本表和视图都是表。基本表是实际存储在数据库中的表。视图是虚表,它是从基本表或其它视图中导出的表。数据库中只存放视图的定义而不存放视图的数据。这些数据仍存放在导出视图的基本表中。用户可用SQL 语句对基本表和视图进行查询等操作。一个表可以带若干索引,索引也存储在存储文件中。每个存储文件
5、就是外部存储器上一个物理文件,存储文件的逻辑结构组成了关系数据库的内模式。SQL的数据定义包括对表、视图、索引的创建和删除。,创建表(CREATE TABLE),语句格式:CREATE TABLE(列级完整性约束条件,列级完整性约束条件,);,创建表(CREATE TABLE),列级完整性约束条件有:NULL(空)UNIQUE(取值唯一),如NOT NULL UNIQUE 表示取值唯一,不能取空值。,举例,【例3.1】建立一个供应商、零件数据库。其中“供应商”表S(Sno,Sname,Status,City)分别表示:供应商代码、供应商名、供应商状态、供应商所在城市。“零件”表P(Pno,Pn
6、ame,Color,Weight,City),表示零件号、零件名、颜色、重量及产地。其中,数据库要满足如下要求:(1)供应商代码不能为空,且值是唯一的,供应商的名也是唯一的。(2)零件号不能为空,且值是唯一的。零件名不能为空(3)一个供应商可以供应多个零件,而一个零件可以由多个供应商供应。,举例,分析:根据题意供应商和零件分别要建立一个关系模式。供应商和零件之间是一个多对多的联系,在关系数据库中,多对多联系必须生成一个关系模式,而该模式的码则是由该联系两端实体的码加上联系的属性构成的,若该联系名为SP,那麽关系模式为SP(Sno,Pno,Qty),其中Qty表示零件的数量。根据上述分析,用SQ
7、L建立一个供应商、零件数据库如下:,建立供应商、零件数据库,CREATE TABLE S(Sno CHAR(5)NOT NULL UNIQUE,Sname CHAR(30)UNIQUE,Status CHAR(8),City CHAR(20)PRIMARY KEY(Sno);CREATE TABLE P(Pno CHAR(6),Pname CHAR(30)NOT NULL,Color CHAR(8),Weight NUMERIC(6,2),City CHAR(20)PRIMARY KEY(Pno);,建立供应商、零件数据库,CREATE TABLE SP(Sno CHAR(5),Pno CHA
8、R(6),Status CHAR(8),Qty NUMERIC(9),PRIMARY KEY(Sno,Pno)FOREIGN KEY(Sno)REFERENCES S(Sno),FOREIGN KEY(Pno)REFERENCES P(Pno);,举例,从上述定义可以看出,“Sno CHAR(5)NOT NULL UNIQUE”语句定义了Sno的列级完整约束条件,取值唯一,不能取空值,需要说明如下:(1)PRIMARY KEY(Sno)已经定义了Sno为主码,所以,“Sno CHAR(5)NOT NULL UNIQUE”语句中的“NOT NULL UNIQUE”可以省略。(2)“FOREIGN
9、 KEY(Sno)REFERENCES S(Sno)”定义了在SP关系中Sno为外码,其取值必须来自S关系中的Sno域。同理在SP关系中Pno也定义为外码。,3.2.2 修改表和删除表,1修改表(ALTER TABLE)语句格式:ALTER TABLE ADD完整性约束条件 DROPMODIFY;,举例,例如,向“供应商”表S增加Zap“邮政编码”可用如下语句:ALTER TABLE S ADD Zap CHAR(6);注意,不论基本表中原来是否已有数据,新增加的列一律为空。又如,将Status字段改为整型可用如下信息:ALTER TABLE S MODIFY Status INT;,2删除表
10、(DROP TABLE),语句格式:DROP TABLE 例如,执行DROP TABLE Student;此后关系 Student不再是数据库模式的一部分,关系中的元组也无法访问。,定义和删除索引,在数据库中,索引使数据库程序无需对整个表进行扫描,就可以在其中找到所需数据。数据库中的索引是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。,定义和删除索引,索引的作用如下:通过创建唯一索引,可以保证数据记录的唯一性。可以大大加快数据检索速度。可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。在使用ORDER BY和GROUP BY子句中进行检
11、索数据时,可以显著减少查询中分组和排序的时间。使用索引可在检索数据的过程中使用优化隐藏器,提高系统性能。,1聚集索引和非聚集索引,聚集索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的,它的叶节点中存储的是实际的数据。非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序。非聚集索引的叶节点存储了组成非聚集索引的关键字值和行定位器。,2建立索引,语句格式:CREATE UNIQUECLUSTER INDEX ON(,);,2建立索引,说明:(1)次序:可选ASC(升序)或DSC(降序),默认值为ASC。(2)UNIQUE
12、:表明此索引的每一个索引值只对应唯一的数据记录。(3)CLUSTER:表明要建立的索引是聚簇索引,意为索引项的顺序是与表中记录的物理顺序 一致的索引组织。,举例,【例3.2】假设供应销售数据库中有供应商S、零件P、工程项目J、供销情况SPJ关系,希望建立四个索引。其中:供应商S中Sno按升序建立索引;零件P中 Pno按升序建立索引;工程项目J中 Jno 按升序建立索引;对供销情况SPJ中的Sno按升序,Pno按降序,Jno按升序建立索引。,举例,解:根据题意建立的索引如下 CREATE UNIQUE INDEX S-SNO ON S(Sno);CREATE UNIQUE INDEX P-PNO
13、 ON P(Pno);CREATE UNIQUE INDEX J-JNO ON J(Jno);CREATE UNIQUE INDEX SPJ-NO ON SPJ(Sno ASC,Pno DESC,JNO ASC);,3删除索引,语句格式:DROP INDEX 例如,执行 DROP INDEX StudentIndex;此后索引StudentIndex不再是数据库模式的一部分。,3.2.4 定义、删除、更新视图,视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。视图包括几个被定义的数据列和多个数据行,但从其本质上讲,这些数据列和数据行来源于其所引用的表。视图不是真实存
14、在的基础表而是一个虚拟表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。,3.2.4 定义、删除、更新视图,视图的优点和作用 可以使视图集中数据、简化和定制不同用户对数据库的不同数据要求。使用视图可以屏蔽数据的复杂性,用户不必了解数据库的结构,就可以方便地使用和管理数据,简化数据权限管理和重新组织数据以便输出到其他应用程序中。视图可以使用户只关心他感兴趣的某些特定数据和他们所负责的特定任务,而那些不需要的或者无用的数据则不在视图中显示。,视图的优点和作用,视图大大地简化了用户对数据的操作。视图可以让不同的用户以不同的方式看到不同或者相同的数据集。在某些情况下,
15、由于表中数据量太大,因此在表的设计时常将表进行水平或者垂直分割,但表的结构的变化对应用程序产生不良的影响,视图则避免了这样的问题。视图提供了一个简单而有效的安全机制。,1视图的创建,语句格式:CREATE VIEW 视图名(列表名)AS SELECT 查询子句 WITH CHECK OPTION;,1视图的创建,视图的创建中,必须遵循如下规定:(1)子查询可以是任意复杂的 SELECT 语句,但通常不允许含有order by 子句和DISTINCT短语。(2)WITH CHECK OPTION表示对UPDATE,INSERT,DELETE操作时保证更新、插入、或删除的行满足视图定义中的谓词条件
16、(即子查询中的条件表达式)。(3)组成视图的属性列名或者全部省略或者全部指定。如果省略属性列名,则隐含该视图由SELECT子查询目标列的主属性组成。,举例,【例3.3】建立“计算机系”(CS表示计算机系)学生的视图,并要求进行修改、插入操作时保证该视图只有计算机系的学生。CREATE VIEW CS-STUDENT AS SELECT Sno,Sname,Sage,Sex FROM Students WHERE SD=CS WITH CHECK OPTION;,由于在CS_STUDENT视图中使用了“WITH CHECK OPTION”子句,因此,对该视图进行修改、插入操作时DBMS会自动加上
17、SD=CS的条件,保证该视图只有计算机系的学生。,举例,2视图的撤消,语句格式:DROP VIEW 视图名例如,DROP VIEW CS-STUDENT将删除视图CS-STUDENT。,33 数据查询,SQL的数据操纵功能包括:SELECT(查询)INSERT(插入)DELETE(删除)UPDATE(修改),3.3.1 Select基本结构,SQL语言提供了SELECT语句进行数据库的查询。语句格式:SELECT ALL|DISTINCT,FROM,WHERE GROUP BY HAVING ORDER BY ASC|DESC,典型的SQL查询具有如下:,所对应关系代数表达式为:,需要说明的是
18、:,SQL查询中的子句顺序:SELECT、FROM、WHERE、GROUP BY、HAVING和ORDER BY。但是SELECT、FROM是必须的,而且,HAVING子句只能与GROUP BY搭配起来使用。SELECT子句对应的是关系代数中的投影运算,用来列出查询结果中的属性。其输出可以是:列名、表达式、集函数,DISTINCT选项可以保证查询的结果集中不存在重复元组。,FROM 子句对应的是关系代数中的笛卡儿积,它列出的是表达式求值过程中需扫描的关系即在 FROM子句中出现多个基本表或视图时,系统首先执行笛卡尔积操作。WHERE子句对应的是关系代数中的选择谓词。WHERE子句的条件表达式中
19、可以使用的运算符如表3-1所示:,需要说明的是:,3.3.1 Select基本结构,说明1 在SELECT查询中,没有带全程量词,但可以将带全程量词的谓词转换成等价的带有存在量词的谓词,其形式如下:说明2 在SELECT查询中,没有逻辑蕴含,但可以利用谓词演算将一个逻辑蕴含的谓词等价地转换,其形式如下:,3.3.2 简单查询,SQL最简单的查询是找出关系中满足特定条件的元组,这些查询与关系代数中的选择操作类似。简单查询只需要使用三个保留字SELECT、FROM和WHERE。,举例,【例3.4】查询学生-课程数据库中计算机系学生的学号、姓名及年龄。SELECT Sno,Sname,Sage FR
20、OM Students WHERE SD=CS;,举例,【例3.5】查询数学系全体学生的详细信息。SELECT*FROM Students WHERE SD=MS;【例3.6】查询学生的出生年份。SELECT Sno,2004-Sage FROM Students;,3.3.3 连接查询,若查询涉及两个以上的表,则称为连接查询。【例3.7】检索选修了课程号为“C1”的学生号和学生姓名可用连接查询和嵌套查询实现,实现方法如下:SELECT Sno,Sname FROM Students,SC WHERE Students.Sno=SC.Sno AND SC.Cno=C1,举例,【例3.8】检索选
21、修课程名为“MS”的学生号和学生姓名可用连接查询和嵌套查询实现,实现方法如下:SELECT Sno,Sname FROM Students,SC,C WHERE Students.Sno=SC.Sno AND SC.Cno=C.Cno AND C.Cname=MS,举例,【例3.9】检索至少选修了课程号为“C1”和“C3”的学生号,实现方法如下:SELECT Sno FROM SC SCX,SC SCY WHERE SCX.Sno=SCY.Sno AND SCX.Cno=C1 AND SCY.Cno=C3,子查询与聚集函数,1子查询子查询也称嵌套查询。嵌套查询是指一个 SELECT-FROM-
22、WHERE查询块可以嵌入另一个查询块之中。在SQL中允许多重嵌套。,举例,【例3.10】例3.8可以采用嵌套查询来实现。SELECT Sno,Sname FROM Students WHERE Sno IN(SELECT Sno FROM SC WHERE Cno IN(SELECT Cno FROM C WHERE Cname=MS),2聚集函数,聚集函数是一个值的集合为输入,返回单个值的函数。SQL 提供了5个预定义集函数:平均值AVG、最小值MIN、最大值MAX、求和SUM及计数COUNT,如表 3-2所示。,2聚集函数,2聚集函数,使用ANY和ALL谓词必须同时使用比较运算符,其含义及
23、等价的转换关系如表 3-3所示。用集函数实现子查询通常要比直接用ALL或ANY查询效率高。,举例,【例3.11】查询课程C1的最高分和最低分以及高低分之间的差距SELECT MAX(G),MIN(G),MAX(G)-MIN(G)FROM SC WHERE Cno=C1,举例,【例3.12】查询其它系比计算机系CS所有学生年龄都要小的学生姓名及年龄。方法1:(用ALL谓词)SELECT Sname,Sage FROM Students WHERE SageCS,举例,方法2:(用MIN集函数)从等价的转换关系表3-3中可见,“CS,举例,【例3.13】查询其它系比计算机系某一学生年龄小的学生姓名
24、及年龄。方法1:(用ANY谓词)SELECT Sname,Sage FROM Students WHERE SageCS,举例,方法2:“CS,分组查询,1.GROUP BY子句在WHERE子句后面加上 GROUP BY子句可以对元组重新组织,并进行分组。保留字GROUP BY后面跟一个分组属性列表。SELECT子句中使用的聚集操作符仅用在每个分组上。,举例,【例3.14】学生数据库中的SC关系,查询每个学生的平均成绩。SELECT Sno,AVG(Grade)FROM SC GROUP BY Sno,2.HAVING子句,假如元组在分组前按照某种方式加上限制,使得不需要的分组为空,可以在GR
25、OUP BY子句后面跟一个HAVING子句即可。,2.HAVING子句,当元组含有空值时,应注意:第一,空值在任何聚集操作中被忽视。它对求和、求平均值和计数都没有影响。它也不能是某列的最大值或最小值。例如,COUNT(*)是某个关系中所有元组数目之和,但COUNT(A)却是A属性非空的元组个数之和。第二,NULL值又可以在分组属性中看作是一个一般的值。例如,SELECT A,AVG(B)FROM R中,当A的属性值为空时,就会统计A=NULL的所有元组中B的均值。,举例,【例3.15】供应商数据库中的S、P、J、SPJ关系,查询某工程至少用了3家供应商(包含3家)供应的零件的平均数量,并按工程
26、号的降序排列。SELECT JNO,AVG(QTY)FROM SPJ GROUP BY JNO HAVING COUNT(DISTINCT(SNO)2 ORDER BY JNO DESC;,举例,假如按工程号JNO=J1来分组,结果如表3-4 所示。从表中可以看出如果不加DISTINCT,统计的数为 7,而加了DISTINCT,统计的数是5。,3.3.6 更名运算,SQL提供可为关系和属性重新命名的机制,这是通过使用具有如下形式的as子句来实现的:As Old-name as new-nameAs子句即可出现在select子句,也可出现在from子句中。,举例,【例3.16】查询计算机学生的S
27、name和Sage,但Sname的用姓名表示,Sage用年龄表示。其语句如下:SELECT Sname as姓名,Sage as 年龄 FROM Students WHERE SageCS,举例,【例3.17】查询计算机选修了C1课程的学生姓名Sname和成绩Grade。其语句如下:SELECT Sname,Grade FROM Students as x,SC as y WHERE x.sno=y.sno and o=C1,举例,【例3.18】查询平均成绩至少比“1004”平均成绩高的学生学号Sno和平均成绩Grade。其语句如下:SELECT Sno,avg(Grade)FROM SC a
28、s x Group by sno Having avg(Grade)(SELECT avg(Grade)FROM SC as y WHERE y.sno=1004),字符串操作,字符串匹配使用两个特殊的字符来描述模式:“”匹配任意字符串;“_”匹配任意一个字符。模式是大小写敏感的。例如:“Marry%”匹配任何以“Marry”开头的字符串;“idge%”匹配任何包含“idge”的字符串,如“Marryidge”、“Rock Ridge”、“Mianus Bridge”和“Ridgeway”。“_”匹配只含两个字符的字符串;“_”匹配至少包含两个字符的字符串。,举例,【例3.19】学生关系模式为
29、(Sno,Sname,Sex,SD,SAge,SAdd),其中:Sno为学号,Sname为姓名,Sex为性别,SD为所在系,SAge为年龄,SAdd为家庭住址。请查询:查询家庭住址包含“科技路”的学生姓名。检索名字为“晓军”的学生姓名、年龄和所在系。,举例,解:(1)家庭住址包含“科技路”的学生姓名的SQL语句如下:SELECT Sname FROM Students WHERE Add like 科技路(2)名字为“晓军”的学生姓名、年龄和所在系的SQL语句如下:SELECT Sname,Age,SD FROM Students WHERE Sname LIKE _晓军,使用escape关键
30、词来,为了使模式中包含特殊模式字符(即%和_),在 SQL 中允许使用 escape关键词来定义转义符。转义符紧靠着特殊字符,并放在它的前面,表示该特殊字符被当成普通字符。例如在like比较中使用escape关键词来定义转义符,例如使用反斜杠“”作为转义符。,使用escape关键词来,Like abcdescape,匹配所有以abcd开头的字符串。Like abcdescape,匹配所有以abcd开头的字符串。,集合操作,在关系代数中可以用集合的并、交和差来组合关系。SQL也提供了对应的操作,但是查询的结果必须具有相同的属性和类型列表。保留字UNION、INTERSECT和EXCEPT分别对应
31、。保留字用于两个查询时,应该分别用括号括起来。,举例,【例3.20】假定学生和教师关系模式如下所示,查询即是女研究生,又是教师且工资大于等于1500元的名字和地址。Students(Name,Sno,SEX,SD,Type,Address)Teachers(Name,Eno,SEX,Salary,Address),解:本题第一条SELECT语句查询和第二条SELECT语句查询的结果集模式都为(Name,Address),故可以对它们取交集。(SELECT Name,Address FROM Students WHERE SEX女 AND Type研究生)INTERSECT(SELECT Nam
32、e,Address FROM Teachers WHERE Salary 1500),举例,举例,同理,我们也可以对两个相同结果集的关系取差集【例3.21】查询不是教师的学生。(SELECT Name,Address FROM Students)EXCEPT(SELECT Name,Address FROM Teachers),视图的查询和删除,1视图查询【例3.22】建立“计算机系”(CS 表示计算机系)学生的视图如下所示,并要求进行修改、插入操作时保证该视图只有计算机系的学生。,视图的查询和删除,解:CREATE VIEW CS-STUDENT AS SELECT Sno,Sname,Sa
33、ge,Sex FROM Student WHERE SD=CS WITH CHECK OPTION;,举例,例:查询计算机年龄小于20岁的学号及年龄的:SELECT Sno,Sage FORM CS-STUDENT WHERE SD=CS AND Sage20;,系统执行该语句时,通常现将其转换成等价的对基本表的查询然后执行查询语句,即当查询视图表时,系统先从数据字典中取出该视图的定义,然后将定义中的查询语句和对该视图的查询语句结合起来,形成一个修正的查询语句。对上例修正之后的查询语句为:SELECT Sno,Sage FORM Student WHERE SD=CS AND Sage20;,
34、举例,2视图更新,SQL对视图更新必须遵循以下规则:(1)从多个基本表通过连结操作导出的视图不允许更新。(2)对使用了分组、集函数操作的视图则不允许进行更新操作。(3)如果视图是从单个基本表通过投影、选取操作导出的则允许进行更新操作,且语法同基本表。,3With子句举例,【例3.23】假定教师关系模式为Teachers(TName,Eno,Tdept,SEX,Salary,Address),利用With子句查询工资最高的教师姓名。此时,如果具有同样工资最高的教师有多个,它们都会被选择。,3With子句举例,with max-Salary(value)AS SELECT max(Salary)F
35、ROM Teachers WHERE Tname FROM Teachers,max-Salary WHERE Teachers.Salary=max-Salary.value,举例,【例3.24】假定银行帐户关系模式为Account(Account-no,branch-name,balance),其中属性Account-no表示帐号,branch-name表示支行名称,balance表示余额。利用With子句查询所有存款总额少于所有支行平均存款总额的支行。,with branch-total(branch-name,value)AS SELECT branch-name,sum(balanc
36、e)FROM Account GROUP BY branch-namewith branch-total-avg(value)AS SELECT avg(value)FROM branch-totalSELECT branch-name FROM branch-total,branch-total-avg WHERE branch-total.value=branch-total-avg.value,举例,34 数据更新,3.4.1 插入、删除和修改语句1插入语句语句的基本格式:INSERT INTO 基本表名(字段名,字段名)VALUES(常量,常量);查询语句INSERT INTO 基本表
37、名(列表名)SELECT 查询语句,举例,【例3.25】将学号为“3002”、课程号为“C4”、成绩为98的元组插入SC关系中。其语句如下:Insert into SC Values(3002,C4,98),举例,【例3.26】创建一个新的视图v_employees,要求该视图基于表employees创建。create view v_employees(number,name,age,sex,salary)as select number,name,age,sex,salary from employees where name=张三Insert into v_employees Values
38、(001,李力,22,m,2000),2删除语句,语句格式:DELETE FROM 基本表名WHERE 条件表达式【例3.27】删除表employees中姓名为张然的记录。DELETE from employees where name=张然,3修改语句,语句格式:UPDATE 基本表名 SET 列名=值表达式(,列名=值表达式)WHERE 条件表达式【例3.28】将教师的工资增加5。update teachers set Salary=Salary*1.05,举例,【例3.29】将教师的工资小于1000的增加5工资。update teachers set Salary=Salary*1.05
39、 where Salary=1000使用视图可以更新数据记录,但应该注意的是,更新的只是数据库中的基表。,举例,【例3.30】创建了一个基于表employees的视图v_employees,然后通过该视图修改表employees中的记录。create view v_employees as select*from employees update v_employees set name=张然 where name=张三,35 SQL的完整性控制,数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据。保证数据库中数据是正确的,避免非法的更新。数据库完整
40、性重点需要掌握的内容有:完整性约束条件的分类完整性控制应具备的功能。,3.5.1 主键约束 PRIMARY KEY,1完整性约束条件完整性约束条件作用的对象有关系、元组、列三种,共分为六类,见表3-5所示。,3.5.1 主键约束 PRIMARY KEY,2完整性控制,完整性控制应具有三方面的功能:定义功能、检测功能、处理功能。检查是否违背完整性约束的时机有两种:若在一条语句执行完后立即检查称为立即执行约束;若检查需要延迟到整个事务执行完后再执行称为延迟执行约束。数据库中最重要的约束是声明一个或一组属性形成关系的键。最重要的完整性约束条件是:实体完整性和参照完整性。,3实体完整性,在关系中只能有
41、一个主键。声明主键有两种方法(使用“PRIMARY KEY”子句):将PRIMARY KEY保留字加在属性类型之后;在属性列表中引入一个新元素,该元素包含保留字 PRIMARY KEY 和用圆括号括起的形成该键的属性或属性组列表。,举例,【例3.31】学生关系Students(Sno,Sname,Sex,Sdept,Sage),可使用如下语句创建表:CREATE TABLE Students(Sno CHAR(8),Sname CHAR(10),Sex CHAR(1),Sdept CHAR(20),Sage NUMBER(3),PRIMARY KEY(Sno);,或采用如下方法:CREATE
42、TABLE Students(Sno CHAR(8)PRIMARY KEY,Sname CHAR(10),Sex CHAR(1),Sdept CHAR(20),Sage NUMBER(3);,举例,举例,【例3.32】学生选课关系SC(Sno,Cno,Grade),可使用如下语句创建表,CREATE TABLE SC(Sno CHAR(8),Cno CHAR(4),Grade NUMBER(3),PRIMARY KEY(Sno),PRIMARY KEY(Cno);,3.5.2 外键约束 FOREIGN KEY,参照完整性定义格式如下:FOREIGN KEY(属性名)REFERENCES 表名(
43、属性名)ON DELETECASCADE|SET NULL参照完整性通过使用保留字:FOREIGN KEY 定义哪些列为外码;REFERENCES 指明外码对应于哪个表的主码;ON DELETE CASCADE 指明删除被参照关系的元组时,同时删除参照关系中的元组;SET NULL 表示置为空值方式,举例,【例3.33】对于例3.32学生选课关系SC(Sno,Cno,Grade)中,学号Sno参照关系Students,课程号Cno参照关系C。因此对于例3.32的正确的语句为:,CREATE TABLE SC(Sno CHAR(8),Cno CHAR(4),Grade NUMBER(3),PRI
44、MARY KEY(Sno),PRIMARY KEY(Cno),FOREIGN KEY Sno REFERENCES Students(Sno),FOREIGN KEY Cno REFERENCES C(Cno);,举例,3.5.3 属性值上的约束,1NULL【例3.34】学生关系Students(Sno,Sname,Sex,Sdept,Sage),如果要求学生姓名不能为空,那么可使用如下语句创建表,CREATE TABLE Students(Sno CHAR(8),Sname CHAR(10)NOT Null,Sex CHAR(1),Sdept CHAR(20),Sage NUMBER(3),
45、PRIMARY KEY(Sno);,2.CHECK,【例3.35】在Student中,要求男生的年龄在1525岁之间,女生的年龄在1524岁之间。解:在关系Students的定义中增加一条检查子句:(基于元组的检查子句举例),2.CHECK,CREATE TABLE Students(Sno CHAR(8),Sname CHAR(10),Sex CHAR(1),Sdept CHAR(20),Sage NUMBER(3),PRIMARY KEY(Sno)CHECK(Sage=15 AND(SEX=M AND Sage=25)OR(SEX=F AND Sage 25);,3.5.4 全局约束,全局
46、约束是一些较复杂的完整性约束,这些约束涉及多个属性间的联系或多个不同关系间的联系,有基于元组的检查子句断言,3.5.4 全局约束,基于元组的检查子句这种约束是对单个关系的元组值加以约束。方法是在关系定义中的任何地方加上关键字CHECK和约束条件。如:年龄在16至20岁之间可用 CHECK(Sage=16 AND Sage CHECK(),举例,【例3.36】教学数据库的模式Students、SC、C中有一个约束,不允许男同学选修“张勇”老师的课。CREATE ASSERTION ASSE-SC1 CHECK(NOT EXISTS(SELECT*FROM SC WHERE Cno IN(SELE
47、CT Cno FROM C WHERE TEACHER=张勇)AND Sno IN(SELECT Sno FROM Students WHERE SEX=M);,举例,【例3.37】教学数据库的模式Students、SC、C中有一个约束,每门课最多50名男同学选修。解:可写成如下的断言形式:CREATE ASSERTION ASSE-SC2 CHECK(50=ALL(SELECT COUNT(SC.Sno)FROM Students,SC WHERE Students.Sno=SC.Sno AND SEX=M GROUP BY Cno);,3.6 SQL中的触发器,触发器(Trigger)就是
48、一类由来事件驱动的特殊过程,一旦由某个用户定义,任何用户对该触发器指定的数据进行增、删或改操作时,系统将自动激活相应的触发器,在核心层进行集中的完整性控制。,3.6.1 触发器的组成和类型,触发器的定义包括两个方面:(1)指明触发器的触发事件;(2)指明触发器执行的动作。,3.6.1 触发器的组成和类型,触发事件包括表中行的插入、删除和修改,即执行INSERT、DELETE、UPDATE语句。在修改操作(UPDATE)中,还可以指定,特定的属性或属性组的修改为触发条件。事件的触发还有两个相关的时间:Before触发器是在事件发生之前触发After触发器是在事件发生之后触发,3.6.1 触发器的
49、组成和类型,触发动作实际上是一系列SQL语句,可以有两种方式:(1)对被事件影响的每一行(FOR EACH ROW)每一元组执行触发过程,称为行级触发器。(2)对整个事件只执行一次触发过程(FOR EACH STATEMENT),称为语句级触发器。该方式是触发器的默认方式。,3.2.2 创建触发器,1创建触发器语句的格式 CREATE TRIGGER BEFORE|AFTER DELETE|INSERT|UPDATEOF列名清单 ON 表名 REFERENCING临时视图名 WHEN触发条件|触发动作 FOR EACHROW|STATEMENT,说明,(1)BEFORE:指示DBMS在执行触发
50、语句之前激发触发器。(2)AFTER:指示 DBMS 在执行触发语句之后激发触发器。(3)DELETE:指明是DELETE触发器,每当一个DELETE 语句从表中删除一行时激发触发器。,(4)INSERT:指明是INSERT触发器,每当一个INSERT语句向表中插入一行时激发触发器。(5)UPDATE:指明是 UPDATE 触发器,每当UPDATE语句修改由OF子句指定的列值时,激发触发器。如果忽略OF子句,每当UDPATE语句修改表的任何列值时,DBMS都将激发触发器。,说明,说明,(6)REFERENCING 临时视图名:指定临时视图的别名。在触发器运行过程中,系统会生成两个临时视图,分别