数据库第三章课后习题解答Word下载.docx
《数据库第三章课后习题解答Word下载.docx》由会员分享,可在线阅读,更多相关《数据库第三章课后习题解答Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
SEXchar
(1)notNULLcheck(sex='
0'
orsex='
1'
),
BDATEdatetime,
DEPTvarchar(10),
DORMITORYvarchar(10)
)
图3.17用SQL语句创建students表
进入企业管理器用基本操作创建students表。
用右键单击“mydb”数据库,从弹出的菜单中选择“新建”,再从其下一级菜单中选择“表”。
或者,用右键单击“mydb”数据库下一级的“表”,从弹出的菜单中选择“新建表”。
然后,在弹出的窗体中,把students表所包含的字段逐一输入,每个字段都要指明列名、数据类型、长度和是否允许空值、是否主键等内容,如图3.18所示。
图3.18用基本操作创建students表
其中,SEX字段取值为0或1,需要建立约束。
操作是用右键单击SEX字段,从弹出的菜单中选择“CHECK约束”,再从弹出的“属性”窗体中,选择“CHECK约束”卡,在约束表达式框中输入约束表达式,如图3.19所示。
图3.19输入约束表达式
最后,单击“保存”图标,SQLServer将弹出一个“选择名称”对话框,输入表名“students”,单击“确定”按钮,新建的students表结构将被保存起来。
3.5在Access中,完成习题3.4的要求。
(SNOtext(10)notnullprimarykey,
NAMEtext(10)notnull,
SEXtext(10)notnull,
BDATEdatetime,
DEPTtext(10),
DORMITORYtext(10))
注意,J-SQL的CREATETABLE语句没有提供对字段的检查约束。
可以在创建表后,使用基本操作方式,对SEX字段建立有效性规则。
3.7在SQLServer中,创建表Depts(DNO,DNAME,MGR)。
用SQL语句在习题3.4中创建的Students表中将DEPT设置为外键,引用Depts表中的DNO列值。
若某系还有学生时,不得在Depts表中删除该系的记录。
usemydb
createtableDepts
(DNOvarchar(10)notNULLprimarykey,
DNAMEchar(10)notNULL,
MGRchar(10))
altertablestudentsaddconstraintc1
foreignkey(Dept)referencesDepts(Dno)ondeletecascade
3.8什么是视图?
视图的作用是什么?
在习题3.4所创建的Students表的基础上,建立一个显示所有计算机系学生的视图,假设计算机系的代号为‘CS’。
go
createviewstudent_cs_view/*SQLSERVER约定:
本语句必须为批处理的第一个语句*/
as
select*
fromstudents
wherestudents.DEPT='
cs'
3.11在SQLServer中完成下列操作:
①用修改表结构语句在Students表中添加整型的Height和Weight字段。
②创建一个规则并绑定到Height列,用以限制插入到该列的整数范围。
③创建一个默认值并绑定到Weight列,插入记录时,默认值自动填充到该列中。
④基于Students表与Depts表,分别建立惟一性约束、检查约束、主键约束、外键约束和参照(引用)完整性约束,并辅以其他操作予以验证。
⑤创建并执行一个带SELECT查询语句的存储过程,统计出每个系的学生平均身高。
⑥创建一个触发器,其功能是:
当试图在Depts表中修改数据时将发出警告消息。
①在Students表中添加整型的Height和Weight字段:
altertablestudentsaddHeightint,Weightint
②创建一个规则并绑定到Height列,用以限制插入到该列的整数范围:
createruleR1as@range>
=145and@range<
=200
execsp_bindrule@rulename='
R1'
@objname='
students.Height'
③创建一个默认值并绑定到Weight列,插入记录时默认值自动填充到该列中:
createdefaultD1as50
execsp_bindefault@defname='
D1'
@objname='
students.Weight'
④基于Students表与Depts表,分别建立惟一性约束、检查约束、主键约束、外键约束和参照(引用)完整性约束:
/*假设在mydb库中建表,若表students已存在,创建前先把该表删除*/
(SNOchar(10)notNULLprimarykey,/*主键约束*/
NAMEvarchar(10)notNULLunique,/*惟一性约束*/
SEXchar
(1)notNULLcheck(sex='
orsex='
),/*检查约束*/
DEPTvarchar(10)constraintc1foreignkey(Dept)/*外键约束*/
referencesDepts(Dno)ondeletecascade,/*参照完整性约束*/
DORMITORYvarchar(10)
注:
创建表后,有关验证性的操作,请读者自行完成。
⑤创建一个带SELECT查询语句的存储过程p1,统计出每个系的学生平均身高:
createprocp1
as
selectdept,avg(Height)asavg_h
fromstudents
groupbydept
return
执行存储过程p1的语句如下:
execp1
⑥创建一个触发器,其功能是当试图在Depts表中修改数据时将发出警告消息:
createtriggert1ondepts
forupdate
raiserror('
警告!
'
10,1)
当使用update语句修改Depts表中数据时,将在消息栏显示“警告!
”消息。
3.12假设教学数据库中有三个表,其数据结构如下:
学生表S(学号SNO,姓名SNAME,年龄AGE,性别SEX);
选修表SC(学号SNO,课程号CNO,成绩GRADE);
课程表C(课程号CNO,课程名CNAME,任课教师TEACHER);
试用基本的SELECT语句表达下列操作:
①检索选修课程号为C06的学生学号与成绩。
②检索选修课程号为C06的学生学号与姓名。
③检索选修课程名为ENGLISH的学生学号与姓名。
④检索选修课程号为C08或C12的学生学号与成绩。
⑤检索至少选修课程号为C08和C12的学生学号与成绩。
⑥检索没有选修C02号课程的学生姓名与年龄。
⑦检索选修了全部课程的学生姓名。
⑧检索选修课程中包含了学生S05所学课程的学生学号。
⑨求女学生的总人数和平均年龄。
⑩统计选修了课程的学生人数。
selectsno,grade
fromsc
wherecno='
c06'
第1种查询方法——连接查询:
SELECTs.sno,sname
FROMs,sc
WHEREs.sno=sc.snoandcno='
;
第2种查询方法——嵌套查询:
SELECTsno,sname
FROMs
WHEREsnoin
(SELECTsno
FROMsc
WHEREcno='
);
嵌套查询(使用相关查询):
WHERE'
in
(SELECTcno
WHEREsno=s.sno);
第3种查询方法——使用存在量词的嵌套查询:
SELECTsno,sname
WHEREexists(SELECT*
WHEREs.sno=sc.snoandcno='
嵌套查询:
(SELECTsno
FROMsc
WHEREcnoin
FROMc
WHEREcname='
ENGLISH'
));
连接查询:
FROMs,c,sc
WHEREs.sno=sc.snoando=oandcname='
english'
;
SELECT*
FROMsc
WHEREcno='
C08'
orcno='
C12'
注:
这里输出选修表sc的所有列,除学生学号与成绩外,还有选课的课程号。
若某个学生同时选修了C08和C12两门课程,可通过选课的课程号予以区分。
SELECTA.sno,A.grade,B.grade
FROMscASA,scASB
WHEREA.sno=B.snoandA.cno='
andB.cno='
;
SELECTsname,age