数据库第三章部分习题答案Word格式.docx
《数据库第三章部分习题答案Word格式.docx》由会员分享,可在线阅读,更多相关《数据库第三章部分习题答案Word格式.docx(11页珍藏版)》请在冰点文库上搜索。
groupbys#
havingcount(c#)>
=2;
3.2.5检索至少有学号为S2和S4所学的课程和课程名
selectc#,cname
wherec#in((selectc#
fromscwheres#='
S2'
)
intersect
(selectc#fromscwheres#='
S4'
));
3.2.6检索‘WANG’同学不学的课程号
selectc#fromc
except
(selectdistinctc#
fromsc
wheres#=(selects#fromswheresname='
WANG'
));
3.2.7检索全部学生都选修的课程号和课程名
fromc
wherenotexists(selects#
froms
wherec.c#notin(selectc#fromscwheresc.s#=s.s#));
3.2.8检索选修课程包含'
LIU'
老师所授课程的全部课程的学生的学号和姓名
selects#,sname
wherenotexists((selectc#
fromc
wheret#=(selectt#
fromt
wheretname='
))except(selectc#fromscwheresc.s#=s.s#));
3.4设有两个基本表R(A,B,C)和S(A,B,C),试用SQL查询语句表达下列关系代数表达式:
R∪S
R∩S
R-S④R×
S⑤πA,B(R)πB,C(S)
⑥π1,6(σ3=4(R×
S)⑦π1,2,3(RS)⑧R÷
πC(S)
解:
①(SELECT*FROMR)
UNION
(SELECT*FROMS);
②(SELECT*FROMR)
INTERSECT
(SELECT*FROMS);
③(SELECT*FROMR)
MINUS
④SELECT*
FROMR,S;
⑤SELECTR.A,R.B,S.C
FROMR,S
WHERER.B=S.B;
⑥SELECTR.A,S.C
WHERER.C=S.A;
⑦SELECTR.*(R.*表示R中全部属性)
WHERER.C=S.C;
⑧R÷
πC(S)的元组表达式如下:
{t|(∃u)(∀v)(∃w)(R(u)∧S(v)∧R(w)∧w[1]=u[1]∧w[2]=u[2]∧w[3]=v[3]∧t[1]=u[1]∧t[2]=u[2])}
据此,可写出SELECT语句:
SELECTA,B
FROMRRX
WHERENOTEXISTS
(SELECT*
FROMS
FROMRRY
WHERERY.A=RX.AANDRY.B=RX.BANDRY.C=S.C));
3.6试叙述SQL语言的关系代数特点和元组演算特点。
答:
SQL的关系代数特点如下:
1有关系代数运算的并、交、差、自然联接等运算符;
2FROM子句体现了笛卡尔积操作,WHERE子句体现了选择操作,SELECT子句体现了投影操作。
SQL的元组演算特点如下:
1FROM子句中的基本表名应视为“元组变量”,属性名应视为“元组分量”;
2有存在量词EXISTS符号。
3.12试用SQL更新语句表达对3.2题教学数据库中关系S、SC、C的更新操作:
往关系C中插一个课程元组('
C8'
,'
VC++'
T6'
)。
检索所授每门课程平均成绩均大于80分的教师姓名,并把检索到的值送往另一个已存在的表FACULTY(TNAME)。
在SC中删除尚无成绩的选课元组。
把选修LIU老师课程的女同学选课元组全部删去。
把MATHS课不及格的成绩全改为60分。
把低于所有课程总平均成绩的女同学成绩提高5%。
在表SC中修改C4课程的成绩,若成绩小于等于70分时提高5%,若成绩大于70分时提高4%(用两种方法实现,一种方法是用两个UPDATE语句实现,另一种方法是用带CASE操作的一个UPDATE语句实现)。
⑧在表SC中,当某个成绩低于全部课程的平均成绩时,提高5%。
①INSERTINTOC
VALUES('
);
②INSERTINTOFACULTY(TNAME)
SELECTDISTINCTTEACHER
FROM(SELECTTEACHER,C.C#,AVG(GRADE)
FROMS,SC
WHERESC.C#=C.C#
GROUPBYTEACHER,C.C#)
ASRESULT(TEACHER,C#,AVG_GRADE)ASX
WHERE80<
=ALL(SELECTAVG_GRADE
FROMRESULTASY
WHEREY.TEACHER=X.TEACHER);
③DELETEFROMSC
WHEREGRADEISNULL;
④DELETEFROMSC
WHERES#IN(SELECTS#FROMSWHERESEX='
F'
ANDC#IN(SELECTC#FROMCWHERETEACHER='
⑤UPDATESC
SETGRADE=60
WHEREGRADE<
60
ANDC#IN(SELECTC#FROMCWHERECNAME='
MATHS'
⑥UPDATESC
SETGRADE=GRADE*1.05
ANDGRADE<
(SELECTAVG(GRADE)FROMSC);
⑦用两个UPDATE语句实现:
UPDATESC
SETGRADE=GRADE*1.04
WHEREC#='
C4'
ANDGRADE>
70;
ANDGRADE<
=70;
(这两个UPDATE语句的顺序不能颠倒。
用一个UPDATE语句实现:
SETGRADE=GRADE*CASE
WHENGRADE>
70THEN1.04
ELSE1.05
END
;
⑧UPDATESC
SETGRADE=GRADE*1.05
WHEREGRADE<
(SELECTAVG(GRADE)
FROMSC);
3.13设数据库中有三个关系:
职工表EMP(E#,ENAME,AGE,SEX,ECITY),
其属性分别表示职工工号、姓名、年龄、性别和籍贯。
工作表WORKS(E#,C#,SALARY),
其属性分别表示职工工号、工作的公司编号和工资。
公司表COMP(C#,CNAME,CITY),
其属性分别表示公司编号、公司名称和公司所在城市。
试用SQL语句写出下列操作:
①用CREATETABLE语句创建上述三个表,需指出主键和外键。
②检索超过50岁的男职工的工号和姓名。
③假设每个职工只能在一个公司工作,检索工资超过1000元的男性职工工号和姓名。
④假设每个职工可在多个公司工作,检索在编号为C4和C8公司兼职的职工工号和姓名。
⑤检索在“联华公司”工作、工资超过1000元的男性职工的工号和姓名。
⑥假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和工资总数.显示(E#,NUM,SUM
_SALARY),分别表示工号、公司数目和工资总数。
⑦工号为E6的职工在多个公司工作,试检索至少在E6职工兼职的所有公司工作的职工工号。
⑧检索联华公司中低于本公司平均工资的职工工号和姓名。
⑨在每一公司中为50岁以上职工加薪100元(若职工为多个公司工作,可重复加)。
⑩在EMP表和WORKS表中删除年龄大于60岁的职工有关元组。
①CREATETABLEEMP
(E#CHAR(4)NOTNULL,
ENAMECHAR(8)NOTNULL,
AGESMALLINT,
SEXCHAR
(1),
ECITYCHAR(20),
PRIMARYKEY(E#));
CREATETABLECOMP
(C#CHAR(4)NOTNULL,
CNAMECHAR(20)NOTNULL,
CITYCHAR(20),
PRIMARYKEY(C#));
CREATETABLEWORKS
C#CHAR(4)NOTNULL,
SALARYSMALLINT,
PRIMARYKEY(E#,C#),
FOREIGNKEY(E#)REFERENCESEMP(E#),
FOREIGNKEY(C#)REFERENCESCOMP(C#));
②SELECTE#,ENAME
FROMEMP
WHEREAGE>
50ANDSEX='
M'
③SELECTEMP.E#,ENAME
FROMEMP,WORKS
WHEREEMP.E#=WORKS.E#ANDSALARY>
1000;
④SELECTA.E#,A.ENAME
FROMEMPA,WORKSB,WORKSC
WHEREA.E#=B.E#ANDB.E#=C.E#
ANDB.C#='
ANDC.C#='
⑤SELECTA.E#,A.ENAME
FROMEMPA,WORKSB,COMPC
WHEREA.E#=B.E#ANDB.C#=C.C#
ANDCNAME='
联华公司'
ANDSALARY>
1000
ANDSEX='
⑥SELECTE#,COUNT(C#)ASNUM,SUM(SALARY)ASSUM_SALARY
FROMWORKS
GROUPBYE#;
⑦SELECTX.E#
FROMWORKSX
(SELECT*
FROMWORKSY
WHEREE#='
E6'
ANDNOTEXISTS
FROMWORKSZ
WHEREZ.E#=X.E#
ANDZ.C#=Y.C#));
⑧SELECTA.E#,A.ENAME
ANDCNAME='
ANDSALARY<
(SELECTAVG(SALARY)
FROMWORKS,COMP
WHEREWORKS.C#=COMP.C#
⑨UPDATEWORKS
SETSALARY=SALARY+100
WHEREE#IN(SELECTE#FROMEMPWHEREAGE>
50);
⑩DELETEFROMWORKS
WHEREE#IN(SELECTE#FROMEMPWHEREAGE>
60);
DELETEFROMEMP
WHEREAGE>
60;
如有侵权请联系告知删除,感谢你们的配合!