《数据库基础教程课件.ppt》由会员分享,可在线阅读,更多相关《数据库基础教程课件.ppt(155页珍藏版)》请在三一办公上搜索。
1、第四章 SQL,提纲,SQL概述SQL数据定义功能SQL数据查询功能SQL数据修改功能SQL数据控制功能嵌入式SQL,SQL概述,历史SQL: Struceured Query Languang1974年,由Boyce和Chamber提出1975-1979年,在System R上实现,由IBM的San Jose研究室研制,称为Sequel,SQL概述,用户1,用户2,用户4,视图V1,视图V1,用户3,基本表B1,基本表B2,基本表B4,基本表B3,存储文件S1,存储文件S2,存储文件S4,存储文件S3,SQL数据库体系结构,SQL用户,VIEW,Base Table,Stored file,
2、SQL概述,标准化有关组织ANSI(American Natural Standard Institute)ISO(International Organization for Standardization)有关标准SQL-86“数据库语言SQL”SQL-89“具有完整性增强的数据库语言SQL”,增加了对完整性约束的支持SQL-92“数据库语言SQL”,是SQL-89的超集,增加了许多新特性,如新的数据类型,更丰富的数据操作,更强的完整性、安全性支持等。SQL-3正在讨论中的新的标准,将增加对面向对象模型的支持,SQL概述,特点一体化集DDL,DML,DCL于一体单一的结构-关系,带来了数据
3、操作符的统一面向集合的操作方式一次一集合高度非过程化用户只需提出“做什么”,无须告诉“怎么做”,不必了解存取路径两种使用方式,统一的语法结构SQL既是自含式语言(用户使用),又是嵌入式语言(程序员使用)语言简洁,易学易用,SQL概述,示例关系,DEPT(D# , DNAME , DEAN)S(S# , SNAME , SEX , AGE , D#)COURSE(C# , CN , PC# , CREDIT)SC(S# , C# , SCORE)PROF(P# , PNAME, AGE, D# , SAL)PC(P# , C#),SQL数据定义功能,域定义基本表的定义索引的定义数据库的建立与撤消
4、SQL数据定义特点,域定义,域类型(SQL-92)char(n):固定长度的字符串varchar(n):可变长字符串int:整数smallint:小整数类型numeric(p,d):定点数,小数点左边p位,右边q位real:浮点数double precision:双精度浮点数date:日期(年、月、日)time:时间(小时、分、秒)interval:两个date或time类型数据之间的差,域定义,域定义格式 create domain 域名 数据类型示例create domain person-name char(20) 类似C语言中:typedef ADDRESS_LISTchar name
5、10;char telephone20;char location20char email20;ADDRESS_LIST tom;,基本表的定义,基本表的定义(CREATE)格式 create table 表名( 列名 数据类型 default 缺省值 not null ,列名 数据类型 default 缺省值 not null ,primary key(列名 ,列名 ) ,foreign key (列名 ,列名 ) references 表名 (列名 ,列名 ) ,check(条件),基本表的定义,示例CREATE TABLE S( S# CHAR(4), SNAME CHAR(8) NOT
6、 NULL, AGE SMALLINT, SEX CHAR(1), PRIMARY KEY (S#), CHECK (SEX=0 OR SEX=1),基本表的定义,CREATE TABLE C( C# CHAR(4), CNAME CHAR(10) NOT NULL, TEACHER CHAR(8), PRIMARY KEY (C#),),基本表的定义,CREATE TABLE SC(S# CHAR(4), C# CHAR(4), GRADE SAMLLINT, PRIMARY KEY (S#,C#), FOREIGN KEY (S#)REFERENCES S(S#), FOREIGN KEY
7、 (C#)REFERENCES C(S#), CHECK(GRADE IS NULL) OR GRADE BETWEEN 0 AND 100),基本表的定义,示例 create domain person_name char(20)create table PROF( PNO char10, person_name PNAME not null, SAL int, AGE int, DNO char10, primary key (PNO), foreign key (DNO) references DEPT(DNO), check (SAL 0),基本表的定义,修改基本表定义(ALTER)格
8、式:alter table 表名add 子句增加新列drop 子句删除列modify 子句修改列定义示例alter table PROFadd LOCATION char30,基本表的定义,撤消基本表定义(drop)格式drop table 表名示例 drop table DEPTDANGER 撤消基本表后,基本表的定义、表中数据、索引、以及由此表导出的视图的定义都被删除,索引的定义,索引的定义格式create unique/distinct cluster index 索引名on 表名 (列名 asc/desc , 列名asc/desc) unique(distinct):唯一性索引,不允许
9、表中不同的行在索引列上取相同值。若已有相同值存在,则系统给出相关信息,不建此索引。系统并拒绝违背唯一性的插入、更新 cluster:聚集索引,表中元组按索引项的值排序并物理地聚集在一起。一个基本表上只能建一个聚集索引 asc/desc:索引表中索引值的排序次序,缺省为asc,索引的定义,示例: create cluster index s-index on S(S#)索引的删除格式 drop index 索引名,索引的定义,索引的有关说明可以动态地定义索引,即可以随时建立和删除索引不允许用户在数据操作中引用索引。索引如何使用完全由系统决定,这支持了数据的物理独立性应该在使用频率高的、经常用于连
10、接的列上建索引一个表上可建多个索引。索引可以提高查询效率,但索引过多耗费空间,且降低了插入、删除、更新的效率,数据库的建立与撤消,有的数据库系统支持多库建立一个新数据库create database 数据库名撤消一个数据库drop database 数据库名指定当前数据库database 数据库名指定当前数据库close database 数据库名,SQL数据定义特点,SQL中,任何时候都可以执行一个数据定义语句,随时修改数据库结构。而在非关系型的数据库系统中,必须在数据库的装入和使用前全部完成数据库的定义。若要修改已投入运行的数据库,则需停下一切数据库活动,把数据库卸出,修改数据库定义并重新
11、编译,再按修改过的数据库结构重新装入数据数据库定义不断增长(不必一开始就定义完整)数据库定义随时修改(不必一开始就完全合理)可进行增加索引、撤消索引的实验,检验其对效率的影响,SQL数据查询功能,SQL数据查询基本结构select子句重复元组的处理from子句where子句更名运算字符串操作元组显示顺序集合操作,SQL数据查询功能,分组和聚集函数空值嵌套子查询派生关系视图关系的连接,SQL数据查询基本结构,基本结构select A1 , A2 , , Anfrom r1 , r2 , , rmwhere P A1 , A2 , , An(p(r1 r2 rm),SQL数据查询基本结构,示例给出
12、所有老师的姓名select PNAMEfrom PROF,select子句,目标列形式 可以为列名,* ,算术表达式,聚集函数“*”:表示“所有的属性”给出所有老师的信息select *fromPROF,select子句,带, , 的算术表达式给出所有老师的姓名及税后工资额select PNAME,SAL 0.95from PROF,重复元组的处理,语法约束 缺省为保留重复元组,也可用关键字all显式指明。若要去掉重复元组,可用关键字distinct或unique指明示例 找出所有选修课程的学生 select distinct SNO from SC,from子句,说明from子句列出查询的对
13、象表当目标列取自多个表时,在不混淆的情况下可以不用显式指明来自哪个关系示例例:找出工资低于500的职工的姓名、工资、系别 selectPNAME , SAL , DNAME from PROF , DEPT where SAL 500 and PROF.DNO = DEPT.DNO,from子句,例:列出教授“哲学”课程的老师的教工号及姓名 select PROF. PNO , PNAME from PROF , PC , COURSE where PROF.PNO = PC.PNOand PC.CNO = COURSE.CNOand COURSE.CNAME = “哲学”,where子句,语
14、法成分比较运算符、 、=、 逻辑运算符and,or,notbetween条件判断表达式的值是否在某范围内,where子句,示例列出工资在500800之间的老师姓名 select PNAME from PROF where SAL between 500 and 800,更名运算,格式old_name as new_name为关系和属性重新命名,可出现在select和from子句中注:as可选,更名运算,示例属性更名 例:给出所有老师的姓名、所纳税额及税后工资额 select PNAME,SAL0.05 as taxi, SAL*0.95 as incomingfrom PROF,更名运算,关系
15、更名 找出工资比所在系主任工资高的老师姓名及工资 select P1.PNAME,P1.SALfrom PROF as P1,PROF as P2,DEPT where P1.DNO = DEPT.DNOand DEPT.DEAN = P2.PNO and P1.SAL P2.SAL,字符串操作,命令格式格式列名 not like “字符串”找出满足给定匹配条件的字符串,字符串操作,匹配规则 “%” 匹配零个或多个字符 “”匹配任意单个字符Escape定义转义字符,以去掉特殊字符的特定含义,使其被作为普通字符看待如escape “”,定义 作为转义字符,则可用%去匹配%,用去匹配,思考:用什么
16、去匹配 ?,字符串操作,示例列出姓名以“张”打头的教师的所有信息 select * from PROF where PNAME like “张%”,字符串操作,列出名称中含有4个字符以上,且倒数第3个字符是d,倒数第2个字符是_的系的所有信息 select * from PROF where PNAME like “% d ”,元组显示顺序,命令order by 列名 asc | desc示例按系名升序列出老师姓名,所在系名,同一系中老师按姓名降序排列 select DNAME,PNAME from PROF,DEPT where PROF.DNO = DEPT.DNO order by DN
17、AME asc,PNAME desc,集合操作,命令集合并:union集合交:intersect集合差: except提示 集合操作自动去除重复元组,如果要保留重复元组的话,必须用all关键词指明,集合操作,示例求选修了001或(且)002号课程的学生号(select SNOfrom SC where CNO = 001)union (intersect)(select SNO from SC where CNO = 002),集合操作,求选修了001和002号而没有选003号课程的学生号(select SNOfrom SC where CNO = 001 or CNO = 002 )exce
18、pt(select SNOfrom SC where CNO = 003),分组和聚集函数,分组命令group by 列名 having 条件表达式 group by将表中的元组按指定列上值相等的原则分组,然后在每一分组上使用聚集函数,得到单一值having则对分组进行选择,只将聚集函数作用到满足条件的分组上,分组和聚集函数,列出每个学生的平均成绩,列出每门课程的平均成绩,group by S#,group by C#,92,85,90,92,92,90,分组和聚集函数,聚集函数平均值:avg最小值:min最大值:max总和:sum记数:count,count(*)与count(列名)的差别,
19、分组和聚集函数,示例列出各系的老师的最高、最低、平均工资 select DNO,max(SAL),min(SAL),avg(SAL) from PROF group by DNO,分组和聚集函数,火眼金睛 求选修了课程的学生人数 select count (SNO ) from SC select PNAME,max(SAL) from PROF select DNO,avg(SAL) from PROF group by DNO where AGE 60,分组和聚集函数,列出及格的学生的平均成绩 select SNO,avg(SCORE) from SC group by SNO havin
20、g min(SCORE) = 60select SNO,avg(SCORE) from SCwhere SCORE =60 group by SNO,哪个正确?,分组和聚集函数,列出每一年龄组中男学生(超过50人)的人数 select AGE,count(S#) from S where SEX = M group by AGE having count(*) 50,空值,空值测试is not null测试指定列的值是否为空值示例找出年龄值为空的老师姓名 select PNAME from PROF where AGE is null不可写为where AGE = null,空值,注意事项除i
21、s not null之外,空值不满足任何查找条件如果null参与算术运算,则该算术表达式的值为null如果null参与比较运算,则结果可视为false。在SQL-92中可看成unknown如果null参与聚集运算,则除count(*)之外其它聚集函数都忽略null,空值,例:select sum(G) from SC例:select count(*) from SC,360,6,嵌套子查询,集合成员资格集合之间的比较集合基数的测试测试集合是否为空测试集合是否存在重复元组,集合成员资格,in 子查询表达式 not in (子查询)判断表达式的值是否在子查询的结果中示例列出张军和王红同学的所有信息
22、 select * from S where SNAME in (“张军”,“王红”),集合成员资格,选修了001号课程的学生的学号及姓名 select SNO,SNAME from S where SNO in (select SNO from SC where CNO = 001),集合成员资格,列出选修了001号和002号课程的学生的学号 select SNO from SC where SC.CNO = 001 and SNO in (select SNO from SC where CNO = 002),集合之间的比较,some/all子查询表达式 比较运算符 some (子查询)
23、表达式的值至少与子查询结果中的一个值相比满足比较运算符 表达式 比较运算符 all (子查询) 表达式的值与子查询结果中的所有的值相比都满足比较运算符,集合之间的比较,示例找出平均成绩最高的学生号 select SNO from SC group by SNO having avg(SCORE) = all(select avg(SCORE) from SC group by SNO),集合基数的测试,测试集合是否为空not exists (子查询)判断子查询的结果集合中是否有任何元组存在,in后的子查询与外层查询无关,每个子查询执行一次,而exists后的子查询与外层查询有关,需要执行多次,
24、称之为相关子查询,集合基数的测试,列出选修了01号课程的学生的学号及姓名 select SNO,SNAME from S where exists (select * from SC where CNO = 01 and SNO = S.SNO),集合基数的测试,列出选修了001号和002号课程的学生的学号 select SNO from SC SC1 where SC1.CNO = 001 and exists (select SNO from SC SC2 where SC2. CNO = 002 and SC2.SNO = SC1.SNO),列出选修了全部课程的学生姓名 select S
25、NAME from S where not exists(select C# from C where not exists(select * from SC where SC.C# = C.C# and SC.S# = S.S# ),任意课程,所求学生选之 不存在任何一门课程,所求学生没有选之,集合基数的测试,列出至少选修了001号学生选修的所有课程的学生名 select SNAME from S where not exists(select CNO from COURSE where exists(select * from SC where SC.CNO = COURSE.CNO an
26、d SC.SNO = 001) and not exists(select * from SC where SC.CNO = COURSE.CNO and SC.SNO = S.SNO),任意课程,001号学生选之,所求学生选之 不存在任何一门课程,001号学生选之,所求学生没有选之,集合基数的测试,测试集合是否存在重复元组unique (子查询)如果子查询结果中没有重复元组,则返回true,集合基数的测试,示例找出所有只教授一门课程的老师姓名 select PNAME from PROF where unique(select PNO from PC where PC.PNO = PROF.
27、PNO),集合基数的测试,找出至少选修了两门课程的学生姓名 select SNAME from S where not unique(select SNO from SC where SC.SNO = S.SNO),to TRUE or not to TRUE , that is the questionunique (a , b , null) , (a , b , null) ?,派生关系,命令(子查询) as 关系名(列名,列名,) SQL-92中,允许在from子句中使用子查询表达式,这时可将该子查询的结果命名为一个临时关系加以引用,派生关系 Vs 视图?,派生关系,示例找出平均成绩及
28、格的学生 先求出每个学生的平均成绩,再从中找出及格的学生 select SNAME , avg(SCORE) from S,SC where SC.SNO = S.SNO group by SC .SNO,派生关系,select SNAME , AVG_SCOREfrom (select SNAME , avg(SCORE) from S,SC where SC.SNO = S.SNO group by SC .SNO) as result(SNAME , AVG_SCORE )where AVG_SCORE = 60,视图,定义视图create view view_name(列名,列名 )
29、as (查询表达式)with check option 视图的属性名缺省为子查询结果中的属性名,也可以显式指明 with check option指明当对视图进行insert,update时,要检查是否满足视图定义中的条件撤消视图drop view view_name,视图,示例create view COMPUTER_PROFas (select PNO , PNAME , SAL from PROF,DEPT where PROF.PNO = DEPT.PNO and DEPT.DNAME = “计算机系”),视图,create view DEPTSAL( DNO, LOW, HIGH,
30、AVERAGE, TOTAL )as ( select DNO, min(SAL), max(SAL), avg(SAL), sum(SAL) from PROF group by DNO ),视图,给出计算机系工资超过800的老师姓名select PNAMEfrom COMPUTER_PROFwhere SAL 800给出计算机系老师的最低、最高、平均工资以及工资总额select LOW , HIGH , AVERAGE , TOTALfrom DEPTSAL , DEPTwhere DEPTSAL.DNO = DEPT.DNO and DEPT.DNAME =“计算机系”,关系的连接,基本
31、分类连接成分包括两个输入关系、连接条件、连接类型连接条件决定两个关系中哪些元组相互匹配,以及连接结果中出现哪些属性连接类型决定如何处理与连接条件不匹配的元组,78,可编辑,关系的连接,关系的连接,自然连接出现在结果关系中的两个连接关系的元组在公共属性上取值相等,且公共属性只出现一次on 出现在结果关系中的两个连接关系的元组在公共属性上取值满足谓词条件P,且公共属性出现两次using (A1, A2 , An) (A1, A2 , An)是两个连接关系的公共属性的子集,元组在(A1, A2 , An)上取值相等,且(A1, A2 , An)只出现一次,关系的连接,内连接舍弃不匹配的元组左外连接内
32、连接 + 左边关系中失配的元组(缺少的右边关系属性值用null表示)右外连接内连接 + 右边关系中失配的元组(缺少的左边关系属性值用null表示)全外连接内连接 + 左边关系中失配的元组(缺少的右边关系属性值用null表示)+ 右边关系中失配的元组(缺少的左边关系属性值用null表示),关系的连接,cross join两个关系的笛卡儿积union join左边关系中失配的元组+ 右边关系中失配的元组对于外连接,连接条件是必须的对于内连接,连接条件是可选的,没有连接条件等价于两个关系的笛卡儿积,关系的连接,列出老师的教工号、姓名、工资、所教课程号select PNO,PNAME,SAL,CNOf
33、rom (PROF nature left outer join PC),关系的连接,R inner join S on R.C = S.C,R,S,关系的连接,R left outer join S on R.C = S.C,R nature right outer join S,关系的连接,R full outer join S on R.C = S.C,SQL的数据修改功能,插入删除修改视图更新,插入操作,命令insert into 表名 (列名,列名values (值 ,值)插入一条指定好值的元组insert into 表名 (列名,列名(子查询)插入子查询结果中的若干条元组,插入操作
34、,示例insert into PROF values ( P123, “王明”, 35, D08, 498 )insert into PROF (PNO, PNAME, DNO)values ( P123, “王明”, D08 ) 思考:SAL取何值?,如何防止插入带有空值的元组?,插入操作,将平均成绩大于90的学生加入到EXCELLENT中insert into EXCELLENT ( SNO, GRADE)select SNO , avg(SCORE)from SCgroup by (SNO)having avg(SCORE) 90,插入操作,不支持修改在子查询中出现的表,insert i
35、nto PROFselect *from PROF,若支持,则完成查询后,再执行修改操作,删除操作,命令delete from 表名 where 条件表达式从表中删除符合条件的元组,如果没有where语句,则删除所有元组,删除操作,示例清除所有选课记录delete from SC删除王明老师所有的任课记录delete from PCwhere PNO in (select PNO from PROF where PNAME = “王明”),删除操作,删除低于平均工资的老师记录delete from PROFwhere SAL (select avg(SAL) from PROF) 思考:是先找
36、到所有符合条件的元组,一并删除,还是找到一个删除一个?,更新操作,命令update 表名 set 列名 = 表达式 | 子查询 列名 = ,表达式 | 子查询where 条件表达式指定对哪些列进行更新,以及更新后的值是什么,更新操作,示例老师工资上调5%update PROFset SAL = SAL * 1.05,更新操作,将D01系系主任的工资改为该系的平均工资update PROFset SAL = (select avg(SAL) from PROFwhere DNO = D01)where PNO = (select DEAN from DEPT where DNO = D01),更
37、新操作,当C1课程的成绩小于该课程的平均成绩时,将该成绩提高5%update SCset GRADE = GRADE * 1.05 where C# = C1and GRADE (select avg(GRADE) from SC where C# = C1),更新操作,工资超过2000的缴纳10%所得税,其余的缴纳5%所得税 update PROF set SAL = SAL * 0.9 where SAL 2000 update PROF set SAL = SAL * 0.95 where SAL = 2000,执行顺序是,还是,?,视图更新,示例create view P_SALas
38、(select PNO , PNAME , SAL from PROF ),insert into P_SALvalues ( P08 , “张立” , 750 ),insert into PROFvalues ( P08 , “张立” , null , null , 750 ),转换为,视图更新,create view SN_AGEas (select SNAME, AGE from S ),insert into SN_AGEvalues ( “张立” ,23 ),insert into Svalues (null, “张立”, 23, null),转换为,缺主码信息,视图,create
39、view S_G(S#, AVERAGE )as ( select S#, avg(GRADE) from SC group by S# )update S_Gset AVERAGE = 85where S# = S1如何更新SC?,视图更新,示例create view S_C_Gas (select SNAME, CNAME , GRADE from S, C, SC where S.S# = SC.S# and C.C# = SC.C# )insert into S_C_Gvalues ( “张立” , “物理”,97 )往SC中插入对应姓名为张立的学号和对应课程名为物理的课程号,以及成绩
40、为97的元组如果有多个张立怎么办?,视图更新,视图更新约束select子句中的目标列不能包含聚集函数select子句中不能使用unique或distinct关键字不能包括group by子句不能包括经算术表达式计算出来的列对于行列子集视图可以更新(视图是从单个基本表使用选择、投影操作导出的,并且包含了基本表的主码),SQL数据控制功能,安全性控制完整性控制,安全性控制,安全性控制定义安全性控制保护数据库以防止不合法的使用所造成的数据泄露和破坏。其基本措施是存取控制安全性措施物理级人际级操作系统级网络级数据库系统级,安全性控制,权限的转授和回收允许用户把已获得的权限转授给其他用户,也可以把已授给
41、其他用户的权限再回收上来权限图结点是用户,根结点是DBA,有向边UiUj,表示用户Ui把某权限授给用户Uj一个用户拥有权限的充分必要条件是在权限图中有一条从根结点到该用户结点的路径,安全性控制,安全性控制,授权命令grant 表级权限 on 表名 | 视图名 to 用户 ,用户 | public with grant option表级权限包括:select, update, insert, delete, index, alter, drop, resource以及它们的总和all,其中对select , update可指定列名with grant option表示获得权限的用户可以把权限再授
42、予其它用户,安全性控制,示例grant select , insert on S to Liming with grant optiongrant all on S to public,安全性控制,回收权限revoke 表级权限 on 表名 | 视图名 from 用户 ,用户 | public收回权限时,若该用户已将权限授予其它用户,则也一并收回。授权路径的起点一定是DBA示例revoke insert on S from Liming,安全性控制,思考一:grant可以基于列授权,当revoke这样的权限时,结果是什么?思考二:执行完下列语句的结果是什么?revoke all on S fr
43、om publicgrant select on S to public,安全性控制,支持多库的数据库系统中授权对象可以是数据库grant 数据库级权限 to 用户 ,用户 | public数据库级权限包括:connect:允许用户在database语句中指定数据库resource:connect权限+建表、删除表及索引权利dba:resource权限 + 授予或撤消其他用户的connect、resource、dba权限不允许dba撤消自己的dba权限,思考: 如何使dba撤消自己的dba权限?,完整性控制,完整性数据的正确性和相容性完整性检查DBMS必须提供一种机制来检查数据库中的数据是否满
44、足规定的条件,以保证数据库中数据是正确的,避免非法的不合语义的错误数据的输入和输出,即所谓的“垃圾进垃圾出”(Garbage In Garbage Out)所造成的无效操作和错误结果,完整性控制,完整性子系统数据库的非法更新数据本身是错误的数据原来是正确的,由于操作或程序错误,导致输入数据错误由于系统故障,导致数据错误事务的并发执行产生不正确结果人为故意破坏完整性子系统功能监督事务执行,检查是否违反完整性规则如有违反现象,采取相应措施(拒绝、报告、改正),完整性控制,完整性规则完整性规则集由DBA或程序员事先提供的有关数据约束的一组规则规则的构成约束条件:要检查什么样的错误(性别为男女)触发条
45、件:什么时候使用规则进行检查(插入元组)ELSE子句:若检查出错误,该怎样进行处理(显示错误)规则的分类域完整性规则:属性取值范围域联系规则:在一个或多个关系中,属性间的联系、影响和约束关系完整性规则:更新操作对数据库中值的影响和限制,完整性控制,主码约束主码值不允许空,也不允许出现重复主码定义形式主码子句:PRIMARY KEY(S#)主码短语:S# CHAR(4) PRIMARY KEY,完整性控制,外码约束 定义形式在SC表中,定义FOREIGN KEY (S#) REFERENCES S(S#)S#在SC中是外码,在S中是主码,S#在SC中取值或为空或为S中某个S#值作为主码的关系称为
46、基本(参照)关系,作为外码的关系称为依赖关系,完整性控制,删除基本关系元组RESTRICT方式只有当依赖关系中没有一个外码值与要删除的基本关系的主码值相对应时,才可以删除该元组,否则系统拒绝此删除操作CASCADE方式将依赖关系中所有外码值与基本关系中要删除的主码值所对应的元组一起删除SET NULL方式删除基本关系中元组时,将依赖关系中与基本关系中被删主码值相对应的外码值置为空值如FOREIGN KEY (S#) REFERENCES S(S#) ON DELETE CASCADE | SET NULL ,完整性控制,修改基本关系主码RESTRICT方式只有当依赖关系中没有一个外码值与要修改
47、的基本关系的主码值相对应时,才可以修改该元组主码,否则系统拒绝此次修改CASCADE方式将依赖关系中所有与基本关系中要修改的主码值所对应的外码值一起修改为新值SET NULL方式:修改基本关系中元组主码时,将依赖关系中与基本关系中被修改主码值相对应的外码值置为空值如FOREIGN KEY (S#) REFERENCES S(S#) ON UPDATE CASCADE | SET NULL ,完整性控制,在属性值上的约束非空约束要求某属性取值不能为空值SNAME CHAR(8) NOT NULL基于属性的检查子句CHECK(AGE15)域约束子句用CREATE DOMAIN定义域时,可以出现 C
48、HECKCREATE DOMAIN AGE SMALLINTCHECK(VALUE = 15) AND VALUE = 25),完整性控制,全局约束全局约束涉及多个属性间的或多个关系间的联系CREATE TABLE SC(S# CHAR(4), C# CHAR(4), GRADE SMALLINT, PRIMARY KEY (S#, C#), CHECK(S# IN (SELECT S# FROM S), CHECK(C# IN (SELECT C# FROM C),如果S中删除元组,不会触发CHECK子句,只有对SC表的更新才会触发,完整性控制,对约束的命名、撤消和添加命名CONSTRAIN
49、T 约束名 示例S# CHAR(4) CONSTRAINT S_PK PRIAMRY KEYAGE SAMLLINT CONSTRAINT AGE_VAL CHECK(AGE = 15 AND AGE = 25),完整性控制,关系上约束的撤消与添加撤消用alter drop添加用alter add示例alter table S drop constraint S_PKalter table SC add constraint SC_CHECK check(S# in select S# from S),完整性控制,域约束的创建、撤消与添加create domain AGE_DOMAIN sma
50、llintconstraint DC_AGE check(value = 15)alter domain AGE_DOMAINadd constraint DC_AGE check(value = 15)alter domain AGE_DOMAINdrop constrain DC_AGE,完整性控制,断言定义CREATE ASSERTION CHECK 断言是谓词,表达数据库总应该满足的条件一旦定义了断言,系统验证其有效性,并且对每个可能违反该断言的更新操作都进行检查这种检查会带来巨大的系统负载,因此应该谨慎使用断言对断言“所有X, P(X)”,是通过检查“not exists X, P(