数据库原理与SQL Server应用 高金兰 著 武汉大学出版社 课后答案.docx
- 文档编号:9855673
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:22
- 大小:143.64KB
数据库原理与SQL Server应用 高金兰 著 武汉大学出版社 课后答案.docx
《数据库原理与SQL Server应用 高金兰 著 武汉大学出版社 课后答案.docx》由会员分享,可在线阅读,更多相关《数据库原理与SQL Server应用 高金兰 著 武汉大学出版社 课后答案.docx(22页珍藏版)》请在冰点文库上搜索。
数据库原理与SQLServer应用高金兰著武汉大学出版社课后答案
第一章习题答案
DDCBDADD
第3章设计题答案
1.学校有若干个系,每个系有若干班级和教研室,每个教研室有若干教师,每名教师只教一门课,每门课可由多个教师教;每个班有若干学生,每个学生选修若干课程,每门课程可由若干学生选修。
请用E-R图画出该学校的概念模型,注明联系类型,再将E-R模型转换为关系模型。
假定:
主码____或#
外码或_____
学院(院名,地址,成立日期,教师人数,学生人数)
系(系名,系址,系主任,院名)
班级(班号,专业名,入学年份,学生数,班级导师,系名)
学生(学号,姓名,性别,出生日期,联系电话,籍贯,班号)
教研室(教研室名称,教师人数,电话,办公室编号,系名)
教师(教工号,姓名,性别,出生日期,联系电话,教研室名称)
课程(课号,课名,学时,学分,开课学期,必修课否,教工号)
选修(学号,课号,成绩)
2.工厂生产的每种产品由不同的零件组成,有的零件可用于不同的产品。
这些零件由不同的原材料制成,不同的零件所用的材料可以相同。
一个仓库存放多种产品,一种产品存放在一个仓库中。
零件按所属的不同产品分别放在仓库中,原材料按照类别放在若干仓库中(不跨仓库存放)。
请用E-R图画出此关于产品,零件,材料,仓库的概念模型,注明联系类型,再将E-R模型转换为关系模型。
产品(产品名,型号,重量,仓库号,数量c)
零件(零件名,规格)
材料(材料编号,名称,仓库号,数量a)
仓库(仓库号,地点,面积,保管员)
产品-零件(产品名,零件名,组装日期b)
零件-材料(材料编号,零件名,生产日期a)
零件-仓库(零件名,仓库号,数量b)
3、一个图书馆理系统中有如下信息:
图书:
书号、书名、数量、位置
借书人:
借书证号、姓名、单位
出版社:
出版社名、邮编、地址、电话、E-mail
其中约定:
任何人可以借多种书,任何一种书可以被多个人借,借书和还书时,要登记相应的借书日期和还书日期;一个出版社可以出版多种书籍,同一本书仅为一个出版社所出版,出版社名具有惟一性。
根据以上情况,完成如下设计:
(1)设计系统的E-R图;
(2)将E-R图转换为关系模式,并指出函数依赖;
(3)指出转换后的每个关系模式的关系键(主键,外键)。
解答:
(1)
图书关系模式:
图书(书号,书名,数量,位置,出版社名)
函数依赖:
(书号→书名,书号→数量,书号→位置,书号→出版社名)
关系主键:
书号
外键:
出版社名
借书人关系模式:
借书人(借书证号,姓名,单位)
函数依赖:
(借书证号→姓名,借书证号→单位)
关系主键:
借书证号
出版社关系模式:
出版社(出版社名,邮编,地址,电话,E-mail)
函数依赖:
(出版社名→邮编,出版社名→地址,出版社名→电话,出版社名→E-mail,地址→邮编)
关系主键:
出版社名
借阅关系模式:
借阅(借书证号,书号,借书日期,还书日期)
函数依赖:
(借书证号,书号)→借书日期,(借书证号,书号)→还书日期
关系主键:
(借书证号,书号)
外键1:
借书证号
外键2:
书号
第五章二设计题答案
--3.
CREATEDATABASEzygl
ON
(NAME='zygl_Data',
FILENAME='E:
\zygl_Data.MDF',
SIZE=1,MAXSIZE=30,FILEGROWTH=10%
)
LOGON
(NAME='zygl_Log',
FILENAME='E:
\zygl_Log.LDF',
SIZE=3,FILEGROWTH=1
)
GO
--4
ATLERDATABASEZYGL
MODIFYFILE
(NAME=ZYGL_DATA,FILEGROWTH=5)
--5
ATLERDATABASEZYGL
ADDFILE
(NAME=ZYGLBAK,
FILENAME='E:
\zygl_Data1.NDF',
SIZE=1,MAXSIZE=50,FILEGROWTH=10%)
--6
DROPDATABASEZYGL
第六章二设计题答案
--1.
Createdatabasescd
Go
Usescd
Go
CREATETABLEdepartment
(系号char(3)PRIMARYKEY,
系名char(20)notnullunique
)
Go
CREATETABLEclass
(班号char(3)PRIMARYKEY,
专业名char(20),
系名char(20)referencesdepartment(系名),
入学年份int
)
Go
CREATETABLEstudent
(学号char(7)PRIMARYKEY,
姓名char(8)NOTNULL,
年龄intconstraintck_nlCHECK(年龄>=15and年龄<=40)constraintdf_nlDEFAULT18,--指定约束名ck_nl和df_nl,以便以后好删除
班号char(3)referencesclass(班号)
)
Insertintostudentvalues(‘2008101’,’张山’,18,’101’);
Insertintostudentvalues(‘2008102’,’李斯’,16,’102’);
Insertintostudentvalues(‘2008103’,’王玲’,17,’111’)
Insertintostudentvalues(‘2008105’,’李飞’,19,’112’);
Insertintoclassvalues(‘101’,’软件’,’计算机’,2005);
Insertintoclassvalues(‘102’,’微电子’,’计算机’,2006);
Insertintoclassvalues(‘111’,’无机化学’,’化学’,2004);
Insertintoclassvalues(‘112’,’高分子化学’,’化学’,2006)
Insertintodepartmentvalues(‘001’,‘数学’);
Insertintodepartmentvalues(‘002’,‘计算机’);
Insertintodepartmentvalues(‘003’,‘化学’)
--2.
--1)
Insertintodepartmentvalues(‘006’,’物理系‘)
Insertintodepartmentvalues(‘008’,’经济系‘)
--2)
Deleteclasswhere入学年份<2004
--3)
Updatestudent
set班号=‘111’
where姓名=‘张山’
--4)
Updatestudentset年龄=年龄+1
--3.
--1)
--要删除年龄列,应先删除该列上的约束,再删除
Altertablestudentdropconstraintck_nl,df_nl
--删除年龄列
Altertablestudentdropcolumn年龄
Altertablestudentadd出生日期datetime
--2)
Altertableclass
Add班长学号char(7)referencesstudent(学号)
--上机题答案
--创建数据库ZYCL
createdatabaseZYGL
go
--使用数据库ZYGL
usezygl
go
--创建数据表
--1.部门表
createtable部门表
(
部门号char
(2)primarykey,
部门名char(10)notnullunique,
电话char(4)
);
go
--2.职员表
createtable职员表
(
员工号char(3)primarykey,
姓名char(8)notnull,
性别char
(2),
部门号char
(2)references部门表(部门号),
出生日期smalldatetime,
手机号码char(11),
工龄tinyintconstraintck_glcheck(工龄>=0and工龄<=35),
备注text
);
go
--3.工资表
createtable工资表
(
员工号char(3)nullreferences职员表(员工号),
基本工资decimal(7,2),
津贴decimal(5,2),
三金扣款decimal(7,2),
应发工资as基本工资+津贴,
实发工资as基本工资+津贴-三金扣款
)
go
--4.工资发放表
createtable工资发放表
(发放编号intidentity(200701,2),
发放年月smalldatetime,
员工号char(3)nullreferences职员表(员工号),
实发工资decimal(7,2)--以后可以用函数调用dbo.fn(员工号)
)
go
第7章习题答案
1.检索“计算机基础”这门课程的课程号和开课学期。
Select课程号,开课学期
Fromkc
Where课程名=’计算机基础’
2.检索身高在175cm以上的男生信息。
Select*
Fromxs
Where性别=’男’and身高>175
3.查询所有姓“李”同学的基本情况。
Select*
Fromxs
Where姓名like‘李%’
4.检索平均成绩在75分以上的学生姓名、性别和专业。
方法一:
Select姓名,性别,专业名
Fromxs
Where学号in(
Select学号
Fromxs_kc
Groupby学号
Havingavg(成绩)>75)
方法二:
Selectxs.学号,姓名,性别,专业名
Fromxs_kc,xs
Wherexs.学号=xs_kc.学号
Groupbyxs.学号,姓名,性别,专业名
Havingavg(成绩)>75
5.将所有学生信息按身高逆序输出。
Select*
Fromxs
Orderby身高desc
6.检索“李林”同学不学的课程号。
Select课程号
Fromkc
Where课程号notin(
Select课程号fromxs,xs_kc
Wherexs.学号=xs_kc.学号andxs.姓名=’李林’)
7.检索至少选修了两门课程的学生学号。
Select学号
Fromxs_kc
Groupby学号
Havingcount(课程号)>=2
8.查询只有两门课不及格的学生姓名。
Select姓名
Fromxs
Where学号in(Select学号
Fromxs_kc
Where成绩<60
Groupby学号
Havingcount(课程号)>=2)
9.检索选修课程包含“程明”同学所选课程之一的学生学号。
Select学号
Fromxs_kc
Where课程号in(
Select课程号fromxs,xs_kc
Wherexs.学号=xs_kc.学号andxs.姓名=’程明’)
10.检索同时选修了课程号为101和102这两门课程的学生学号。
方法一,使用自连接:
Selecta.学号
Fromxs_kca,xs_kcb
Wherea.学号=b.学号anda.课程号=’101’andb.课程号=’102’
方法二,使用子查询:
Select学号
Fromxs
Where学号in(select学号Fromxs_kcwhere课程号=’101’)
And学号in(select学号Fromxs_kcwhere课程号=’102’)
11.检索选修课程名为“计算机原理”的学生学号和姓名。
Selecta.学号,姓名
Fromxsa,xs_kcb,kcc
Wherea.学号=b.学号andb.课程号=c.课程号and课程名=’计算机原理’
12.查询每门课的最高分的学生姓名。
SELECTA.学号,姓名,B.课程号,成绩
FROMXSA,XS_KCB
WHEREA.学号=B.学号AND成绩=
(SELECTMAX(成绩)FROMXS_KCC
WHEREB.课程号=C.课程号)
13.检索选修课程包含学号为061103的学生所修课程的学生学号。
SELECT学号,姓名
FROMxs
WHERENOTEXISTS(
SELECT*
FROMkc,xs_kca
WHEREkc.课程号=a.课程号and学号=’061103’
andNOTEXISTS(
SELECT*
FROMxs_kcb
WHEREb.学号=xs.学号AND课程号=kc.课程号))
14.创建一个名为avg75的视图,包含所有平均成绩在75分以上的学生信息。
Createviewavg75
As
Select*
Fromxs
Where学号in(
Select学号
Fromxs_kc
Groupby学号
Havingavg(成绩)>75)
第8章习题答案
对于数据库scd,库中包含以下系、学生、班级各表:
student(学号,姓名,年龄,班号)
class(班号,专业名,系名,入学年份)
department(系号,系名)
请使用T-SQL语言完成以下各题。
1.为数据库scd建立一个默认对象,使其对应于年龄为18,将其绑定到student表的年龄列上。
Createdefaultd_ageas18
Go
Execsp_bindefault‘d_age’,‘student.年龄’
2.为数据库scd建立一个规则对象,并将其绑定到学生表的专业名列上,规定专业名的取值只能为‘护理学’、‘地质勘探’和‘考古学’之一。
Createruler_zymas@zymin(‘护理学’,‘地质勘探’,’考古学’)
Go
Execsp_bindrule‘r_zym’,‘xs.专业名’
3.修改class表为其建立一个CHECK约束,检查入学年份是否小于2008。
Altertableclass
Addconstraintck_rxnfcheck(入学年份<2008)
4.将student表的班号与姓名这两列组合创建一个升序的非聚集索引。
Createnonclusteredindexix_bj_xmonstudent(班号asc,姓名asc)
5.为department表的系名建立一个唯一索引,如果输入了重复的键,将忽略该INSERT或UPDATE语句,并使用填充因子FILLFACTOR为50%。
Createuniqueindexuqix_xmondepartment(系名asc)
WITHIGNORE_DUP_KEY,FILLFACTOR=50
第9章答案:
三、设计题
1.使用流程控制语句编写程序:
(1)在CJGL数据库中,使用case函数处理:
如果课程的学时在80以上显示学习时间长,学时在54~80显示学习时间一般,否则显示学习时间短。
SELECT课程号,课程名,学习时间=
CASE
WHEN学时>=80THEN'学习时间长'
WHEN学时>=54THEN'学习时间一般'
ELSE‘学习时间短’
END
FROMKC
(2)在CJGL数据库中,使用case函数处理:
如果学生的专业是“计算机”,显示热门,是“通信工程”显示一般,否则显示冷门。
SELECT学号,姓名,专业热度=
CASE专业名
WHEN‘计算机’THEN'热门'
WHEN‘通信工程’THEN'一般'
ELSE'冷门'
END
FROMxs
(3)计算18!
=18*17*16…*2*1。
DECLARE@iint,@pbigint
SELECT@i=1,@p=1
WHILE@i<=18
BEGIN
SET@p=@p*@i
SET@i=@i+1
END
PRINT'18*17*16…*2*1='+CAST(@pASchar(20))
(4)计算S=1!
+2!
+3!
+……+10!
DECLARE@iint,@pbigint,@sbigint
SELECT@i=1,@p=1,@s=0
WHILE@i<=10
BEGIN
SET@p=@p*@i
SET@s=@s+@p
SET@i=@i+1
END
PRINT'1!
+2!
+3!
+……+10!
='+CAST(@sASchar(20))
2.以下各题在CJGL数据库中实现:
(1)创建一个自定义函数名为f_nl,根据一个出生日期计算年龄。
并用‘1989-8-8’调用该函数求年龄。
createfunctionf_年龄(@出生日期datetime,@jtdatetime)
returnsintas
Begin
Declare@年龄int
Set@年龄=year(@jt)-year(@出生日期)
Return@年龄
end
Go
--调用
declare@jtdatetime
set@jt=getdate()
selectdbo.f_年龄('1988-1-2',@jt)
(2)创建一个自定义函数,可以求解任意数n的阶乘,即n!
。
并用n=10调用该函数。
CREATEFUNCTIONF_C(@nINT)
RETURNSINTAS
BEGIN
DECLARE@iint,@pbigint
SELECT@i=1,@p=1
WHILE@i<=@n
BEGIN
SET@p=@p*@i
SET@i=@i+1
END
Return@p
END
Go
--调用
selectdbo.F_C(10)
(4)分别用函数或存储过程实现以下功能:
给定输入参数课程名,统计该课程成绩介于58~59分的学生人数。
使用输入参数“数据库原理”调用该函数或该存储过程。
----函数:
Createfunctionf_cj58(@cnachar(20))returnsint
As
BEGIN
DECLARE@cint
SELECT@c=count(*)fromCJGL.dbo.xs_kca,CJGL.dbo.kcb
wherea.课程号=b.课程号and课程名=@cnaand(成绩between58and59)
Return@c
END
Go
以下函数调用:
Selectdbo.f_cj58(‘数据库原理’)as[58~59分人数]
Go
-----存储过程:
createprocedurep_cj58
@cnachar(20),@cintoutput
as
SELECT@c=count(*)fromCJGL.dbo.xs_kca,CJGL.dbo.kcb
wherea.课程号=b.课程号and课程名=@cnaand(成绩between58and59)
return
Go
--存储过程调用
DECLARE@c1int
Execp_cj58‘数据库原理’,@c1output
(5)创建存储过程来完成求解给定某个学生的学号返回该生的姓名和平均分的功能。
Createprocedurep_pj
@snochar(8),@snachar(8)output,@savgintoutput
as
SELECT@sna=姓名,@savg=avg(成绩)fromCJGL.dbo.xsa,CJGL.dbo.xs_kcb
wherea.学号=b.学号anda.学号=@sno
return
Go
--调用
DECLARE@snachar(8),@savgint
Execp_pj‘061101’,@snaoutput,@savgoutput
3.以下各题在第六章习题(设计题)给出的数据库SCD中实现:
(1)创建一个自定义函数用于统计各班级的人数,将class表增加一个人数字段,然后调用该函数将人数定义为计算列。
USESCD
GO
CREATEFUNCTIONF_CNT(@cnumchar(8))RETURNSint
AS
BEGIN
DECLARE@cntint
SELECT@cnt=count(*)
FROMstudent
WHERE班号=@cnum
RETURN@CNT
END
GO
USESCD/*假定用户函数F_CNT在此数据库中已定义*/
CREATETABLEclass
(班号char(3)PRIMARYKEY,
专业名char(20),
系名char(20)referencesdepartment(系名),
入学年份int
人数ASdbo.F_CNT(班号)
)
(2)创建一个可以按给定学号输出学生的姓名、系名信息的存储过程。
CREATEPROCEDUREstu_info
@snochar(7)
AS
SELECTa.学号,姓名,系名
FROMstudentaINNERJOINclassb
ONa.班号=b.班号
WHERE学号=@sno
GO
调用:
EXECstu_info'2008101'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库原理与SQL Server应用 高金兰 武汉大学出版社 课后答案 数据库 原理 SQL Server 应用 金兰 武汉大学 出版社 课后 答案