数据库习题.docx
《数据库习题.docx》由会员分享,可在线阅读,更多相关《数据库习题.docx(18页珍藏版)》请在冰豆网上搜索。
数据库习题
期末复习与课后练习
一.名词解释:
1.关系
一个关系即一张二维表,如student(sno,sname,sex,age)
2.主码
表中的某个属性组,它可以唯一确定一个元组,如SNO
3.元组
表中的一行即为一个元组
4.属性
表中的一列即为一个属性,如SNO
5.域
属性的取值范围,如人的年龄一般在职~150岁之间
6.元组
关系表中的一行
7.联系
现实世界中事物间的关联(或实体间的关联)
8.实体
客观存在并可互相区别的事物。
9.实体集
同型实体的集合。
10.DBA
数据库管理员
11.X封锁
如果事务T对数据R实现X封锁,那么其他的事务要等T解除X封锁以后,才能对这个数据进行封锁。
12.非码属性
包含在任何一个非候选码中的属性。
13.部分函数依赖
关系模式中,如果X→Y,且X存在真子集X',使X'→Y也成立,这时称X→Y为部分函数依赖。
14.参照完整性
若属性F是基本关系R的外码,它与另一个基本关系S的主码Ks相对应,则对于R中每个元组在F上的值或取空值,或者等于S中某个元组的主码值。
15.一级封锁协议
事务T在修改数据R之前,必须先对其加X锁,事务结束才释放。
典型习题
2、分析题
1.学生与教师教学模型
(1)有若干班级,每个班级包括:
班级号、班级名、专业、人数、教室
(2)每个班级有若干学生,学生只能属于一个班,学生包括:
学号、姓名、性别、年龄
(3)有若干教师,教师包括:
编号、姓名、性别、年龄、职称
(4)开设若干课程,课程包括:
课程号、课程名、课时、学分
(5)一门课程可由多名教师任教,一名教师可任多门课程。
(6)一门课程有多名学生选修,每名学生可选多门课,但选同一门课时,只能选其中一名教师。
解题要求:
(1)画出每个实体及其属性关系、实体间实体联系的(E-R)图。
(2)根据试题中的处理要求:
完成数据库逻辑模型,包括各个表的名称和属性。
(1)
(2)
班级(班级号,班级名,专业,人数,教室),主键:
班级号
学生(学号,姓名,性别,年龄,班级号),主键:
学号
教师(编号,姓名,性别,年龄,职称),主键:
编号
课程(课程号,课程名,课时,学分),主键:
课程号
选课(课程号,学号,成绩),主键:
课程号,学号
任课(课程号,编号,时间),主键:
课程号,编号
五.对于学生选课关系,其关系模式为:
student(sno,sname,sex,age);
course(cno,cname,teacher);
sc(sno,cno,grade)。
用关系代数完成以下查询:
1查询“李通”老师所教授课程的课程号和课程名;
2查询学号为“95002”学生选修的课程号、课程名、任课教师、和成绩;
3查询选了“王海”老师所教授课程的学生姓名;
4查询女生选修课程的课程号、课程名和任课教师;
5查询选了全了课程的学号和姓名。
请用关系代数完成如下查询:
(3分共15分)
答:
1∏cno,cnameσteacher=‘李通’(course)
2∏cno,cname,teacher,gradeσsno=’95002’(student∞sc)
3∏snameσteacher=’王海’(student∞sc∞course)
4∏cno,cname,teacher(σsex=‘女‘(student∞sc∞course)
5.∏sno,sname((∏sno,cnosc÷∏cnocourse)∞student))
六.
请设计一个基于数据库管理的应用软件系统—学生学生信息处理系统模型,要求完成下列功能(本题共15分,每小题3分)
1.画出学生,课程,选课的ER图
2.设计该系统中可能要用到的数据表(写出各个表及其包含的各个字段)
3.画出该系统的功能模块图
4.由此设计模型来简述一下数据库设计的基本步骤。
5.请你来为这一软件选择一种数据库,说出数据库的名字,并简单说明一下选择的理由。
结果A=4,B=2
1
七.设T1,T2是如下两个事务:
T1:
A:
=A+3,B=B*3
T2:
A:
=A*3,B=B+3
问1.若这个事务允许并发执行,则有多少种可能的正确结果?
2.请给出一个可串行化的调度,并给出执行结果?
3.若这2个事务都遵守两段锁协议,请给出一个产生死锁的调度。
答1.有两种可能的正确结果:
T1T2
T2T1
2.可串行化的调度
XlockAXlockA
XlockBwait
读A=0…
读B=0XlockA
A=A+3=3XlockB
B=B*3=3读A=3
Commit读B=9
UnlockAA=A*3=9
UnlockBB=B+3=12
Commit
UnlockA
UnlockB
结果:
A=9,B=12
3.产生死锁的例子:
XlockAXlockB
Waitwait
XlockBXlockA
Waitwait
八.SQL命令题
所有上机题目,请点击题目编号可查看答案
1001
查询全体信息系男同学信息情况
select*fromstudentwheresdept='信息系'andsex='男'
1002
查询选修了3号课的学生的学号和成绩
selectsno,gradefromscwherecno='3'
1003
查询1989年以前出生的学生学号和姓名和出生日期(提示请用year(csrq)函数来取出生年号)
selectsno,sname,csrqfromstudentwhereyear(csrq)<1989
1004
查询信息系所有女生的学号,姓名,及所在系
selectsno,sname,sdeptfromstudentwheresex='女'andsdept='信息系'
1005
查询课程名是数据库的课程号和学分
selectcno,ccreditfromcoursewherecname='数据库'
1006
查询先行课号为5的课程号和课程名
selectcno,cnamefromcoursewherecpno='5'
1007
查询英语系90后的学生情况(注90年后出生的含90年)
select*fromstudentwheresdept='英语系'andyear(csrq)>=1990
1008
查询计算机系或信息系中年龄超过21岁的同学情况.(设当前年为2010年,提示用当前年减去出生年再与21岁比较)
select*fromstudentwheresdept='计算机系'and2010-year(csrq)>21orsdept='信息系'and2010-year(csrq)>21
1009
请将3号课及4号课中成绩大于80分的学生的学号,课程号及成绩显示出来
select*fromscwherecno='3'andgrade>80orcno='4'andgrade>80
1010
查询所有先行课程号为0且学分为2的课程名,先行课程号,及学分
selectcname,cno,cpno,ccreditfromcoursewhereccredit=2andcpno='0'
2001
查询年龄在20-23岁之间(含20与23岁)的学生姓名,系别,年龄(用age表示)(请不要用between语句提交)当前年2010
selectsname,sdept,2010-year(csrq)asagefromstudentwhere2010-year(csrq)<=23and2010-year(csrq)>=20
2002
查询选修过课程且成绩大于80分的所有学生的学号(不许重复)
selectdistinctsnofromscwheregrade>80
2003
请将选修了1号课或3号课课程的同学按课程号升序,成绩降序排序
select*fromscwherecno='1'orcno='3'orderbycno,gradedesc
2004
请将选了1号课程且成绩在60分以上的同学按成绩降序排序
select*fromscwherecno='1'andgrade>60orderbygradedesc
2005
查询选修了1号课的,成绩大于60分,学号后2位数字含8的学号和成绩
selectsno,gradefromscwherecno='1'andgrade>60and(snolike'_______8'orsnolike'______8_')
2006
查询所有李姓的09级同学情况
select*fromstudentwheresnamelike'李%'andsnolike'09%'
2007
查询所有两字姓名的张姓85年后出生同学的姓名,性别与系别
selectsname,sex,sdeptfromstudentwhereyear(csrq)>1985andsnamelike'张_'
2008
查询名字中第3个字为铃4月4号出生的学生的姓名和学号
selectsname,snofromstudentwheresnamelike'__铃%'andmonth(csrq)=4andday(csrq)=4
2009
查询信息系所有不姓刘的同学的学号和姓名
selectsno,snamefromstudentwheresdept='信息系'andsnamenotlike'刘%'
2010
查询学分为3以上(不含3),且课程名中包含着'数据'二字的所有课程名及学分
selectcname,ccreditfromcoursewhereccredit>3andcnamelike'%数据%'
3001
查询所有选修过数据库或信息系统课的学生的姓名,课程名及成绩
selectsname,cname,gradefromstudent,course,scwherestudent.sno=sc.snoando=oand(cname='数据库'orcname='信息系统')
3002
查询选修了1号课且成绩大于80分的的同学的姓名,课程号及成绩
selectsname,cno,gradefromstudent,scwherestudent.sno=sc.snoandcno='1'andgrade>80
3003
查询选了2号课的张姓,孙姓,女生姓名,课程号及成绩,并将成绩按降序排序
selectsname,cno,gradefromstudent,scwherestudent.sno=sc.snoandcno='2'andsex='女'and(snamelike'张%'orsnamelike'孙%')orderbygradedesc
3004
查询计算机系选修了数据库课的所有男生的姓名及该课的成绩
selectsname,gradefromstudent,sc,coursewherestudent.sno=sc.snoando=oandsex='男'andcname='数据库'andsdept='计算机系'
3005
查询09级选修了数据库课的最高成绩.最低成绩和平均成绩(注用as来表示最低,最高及平均成绩
selectmax(grade)as最高成绩,min(grade)as最低成绩,avg(grade)as平均成绩fromsc,coursewhereo=oandsnolike'09%'andcname='数据库'
3006
查询李勇同学选修的成绩在80分以上的课程的学分总和
selectsum(ccredit)as学分总和fromstudent,sc,coursewherestudent.sno=sc.snoando=oandsname='李勇'andgrade>80
3007
查询09级末位学号在15之前的选修过的课程中至少有一门课为4个学分的同学的姓名,课程名,学分(提示请考虑用右截取函数right(sno,2))
selectsname,cname,ccreditfromstudent,sc,coursewherestudent.sno=sc.snoando=oandstudent.snolike'09%'andccredit>=4andright(student.sno,2)<15
3008
查询计算机系所有选了数据库成绩在80分以上的同学的姓名及成绩
selectsname,gradefromstudent,sc,coursewherestudent.sno=sc.snoando=oandsdept='计算机系'andcname='数据库'andgrade>80
3009
查询李勇同学所学课程的学分为2学分以上课程的学分总和及成绩总和(注用as总学分)
selectsum(ccredit)as总学分,sum(grade)as总成绩fromstudent,sc,coursewherestudent.sno=sc.snoando=oandsname='李勇'andccredit>2
3010
查寻选了1号课,计算机系,女生的人数.
selectcount(*)as女生人数fromstudent,sc,coursewherestudent.sno=sc.snoando=oandsex='女'andsdept='计算机系'ando='1'
4001
查询同时选修了1号课和3号课的李姓同学的姓名及系
selectsname,sdeptfromsc,studentwheresc.snoin(selectsnofromscwherecno='1')andcno='3'andstudent.sno=sc.snoandsnamelike'李%'
4002
查询同时选修了数据库及数学的同学的学号
selectdistinctsnofromscwheresnoin(selectsnofromscwherecnoin(selectcnofromcoursewherecname='数据库'))andcnoin(selectcnofromcoursewherecname='数学')
4003
查询选修了全部课程的同学的姓名
selectsnamefromstudent,scwherecno=all(selectcnofromcourse)andstudent.sno=sc.sno
4004
查询与李勇同在一个系,且年龄比他小的同学的姓名(提示用year(csrq)来进行比较)
selectsnamefromstudentwheresdeptin(selectsdeptfromstudentwheresname='李勇')andyear(csrq)>(selectyear(csrq)fromstudentwheresname='李勇')
4005
查询比计算机系平均年龄都大的其它系学生姓名,系和年龄。
(注意不含计算机系的学生)提示设当前年为2010,平均年龄可用avg(2010-year(csrq))表示
selectsname,sdept,(2010-year(csrq))as年龄fromstudentwhere(2010-year(csrq))>all(selectavg(2010-year(csrq))fromstudentwheresdept='计算机系')andsdept<>'计算机系'
4006
查询王名同学没有选的课程名(提示:
就是查询那课程表中所有的但是王名没有选过的课程)
selectcnamefromcoursewherecnonotin(SELECTcnoFROMSCwheresnoin(selectsnofromstudentwheresname='王名'))
4007
查询选修了1号课并且成绩比全班1号课平均成绩低的同学学号及成绩
selectsno,gradefromscwheresnoin(selectsnofromscwherecno='1')andgrade<(selectavg(grade)fromscwheresnoin(selectsnofromscwherecno='1'))
4008
查询选修的学分总数超过8个的学生的姓名
selectsnamefromstudentwheresnoin(selectsnofromsc,coursewhereo=ogroupbysnohavingsum(ccredit)>8)
4009
查询选修了比王名学分数低的其它同学姓名
selectsnamefromstudentwheresnoin(selectsnofromsc,coursewhereo=ogroupbysnohavingsum(ccredit)=(selectsum(ccredit)fromsc,coursewhereo=oandsnoin(selectsnofromstudentwheresname='王名'))andsname<>'王名')
4010
查询比平均成绩比李勇的平均成绩高的同学李姓或王姓姓名
selectsnamefromstudentwheresnoin(selectsnofromscgroupbysnohavingavg(grade)>(selectavg(grade)fromscwheresnoin(selectsnofromstudentwheresname='李勇')))and(snamelike'李%'orsnamelike'王%')
5001
查询所有选修课平均成绩大于85分并且单科成绩大于80分的同学的学号和平均成绩。
selectsno,avg(grade)as'平均成绩'fromscgroupbysnohavingavg(grade)>85andmin(grade)>80
5002
查询至少选修过2门课程且平均成绩在80分以上的的信息系学生学号,及平均成绩
selectsno,avg(grade)as'平均成绩'fromscgroupbysnohavingavg(grade)>80andsnoin(selectsnofromstudentwheresdept='信息系')andcount(*)>=2
5003
查询各系90后的女生人数,分别按系,女生人数表示出来。
selectsdept,count(*)as'90后女生人数'fromstudentwhereyear(csrq)>=1990andsex='女'groupbysdept
5004
查询各门课程所选的人数,然后按照选课人数降序排序,并用课程号及所选人数表示出来
selectcno,count(*)as'所选人数'fromscgroupbycnoorderbycount(*)desc
5005
查询计算机系所选课程中每个同学的平均成绩,最低成绩,最高成绩,并用学号和平均成绩\最低成绩,最高成绩表示出来
selectsno,avg(grade)as'平均成绩',min(grade)as'最低成绩',max(grade)as'最高成绩'fromscwheresnoin(selectsnofromstudentwheresdept='计算机系')groupbysno
5006
查询选修的学分数超过8个学分并且每门课的学分大于等于2的同学姓名学分数和
selectsname,sum(ccredit)fromstudent,sc,coursewheresc.sno=student.snoando=ogroupbysnamehavingsum(ccredit)>8andmin(ccredit)>=2
5007
查询个人平均成绩比王名平均成绩高的,同学姓名及平均成绩
selectsname,avg(grade)as'平均成绩'fromstudent,scwherestudent.sno=sc.snogroupbysnamehavingavg(grade)>(selectavg(grade)fromscwheresnoin(selectsnofromstudentwheresname='王名'))
5008
查询信息系仅选过一门课且成绩在80分以上(含80)的的同学学号
selectsno,avg(grade)as'平均成绩'fromscgroupbysnohavingavg(grade)>=80andsnoin(selectsnofromstudentwheresdept='信息系')andcount(*)=1
5009
查询数据库,数学,信息系统这三门课的选课人数,并用课程名和选课人数表示出来
selectcname,count(*)as'选课人数'fromsc,coursewhereo=oandcnamein('数据库','数学','信息系统')groupbycname
5010
查询每位同学选修课的平均成绩,最低成绩,最高成绩,并按平均