第三章课后作业Word文档格式.docx
《第三章课后作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《第三章课后作业Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
SELECTDISTINCTX.CNO
WHEREX.CNO=Y.CNOANDX.SNO='
01'
ANDY.SNO='
02'
;
(6)检索小红同学不学的课程的课程号
SELECTCNO
WHERENOTEXISTS(SELECT*
FROMS,SC
WHERES.SNO=SC.SNOANDSC.CNO=C.CNOANDSNAME='
小红'
);
(7)检索全部学生都选修的课程的课程号与课程名
WHERENOTEXISTS(SELECT*
WHERESC.SNO=S.SNOANDSC.CNO=C.CNO));
(8)检索选修课程中包含马艳老师所授全部课程的学生学号
SELECTDISTINCTSNO
FROMSCASX
WHERENOTEXISTS
(SELECT*
FROMC,T
WHEREC.TNO=T.TNOANDTname='
杨红'
ANDNOTEXISTS
FROMSCASY
WHEREY.SNO=X.SNOANDY.CNO=X.CNO));
习题3.4
设有两个基本表R(A,B,C)和S(A,B,C),试用SQL查询语句表达下列关系代数表达式:
①
(SELECT
*
FROM
R)
UNION
S);
②
INTERSECT
③
MINUS
④
SELECT
R,
S;
⑤
R.A,
R.B,
S.C
S
WHERE
R.B=S.B;
⑥
R.C=S.A;
⑦
R.*
(R.*表示R中全部属性)
R.C=S.C;
⑧SELECT
A,
B
R
RX
NOT
EXISTS
(
RY
RY.A=RX.A
AND
RY.B=RX.B
RY.C=S.C));
习题3.7
试用SQL查询语句表达下列对3.2题的教学数据中4个基本表T、C、S、SC的查询:
1统计有学生选修的课程门数
COUNT(DISTINCT
TEACHER)
C;
2
求选修C4课程的女学生的平均年龄
AVG(AGE)
S,
SC
S.S#=SC.S#
C#=’C4’
SEX=’F’;
3
求LIU老师所授课程的每门课程的平均成绩
C.C#,AVG(GRADE)
FROM
SC,C
WHERE
SC.C#=C.C#
TEACHER=‘LIU’GROUPBYC.C#;
4
统计每门课程的学生选修人数(超过10人的课程才统计)。
要求显示课程号和人数,查询结果按人数降序排序,若人数相同,按课程号升序排列。
S#,
COUNT(C#)
GROUP
BY
S#
HAVING
COUNT(*)>
5
ORDER
2
DESC,
1;
5
检索学号比WANG同学大,而年龄比他小的学生姓名。
SNAME
S#>
ALL(SELECT
S#
SNAME=’WANG’)
AGE<
SNAME=’WANG’);
6
在表SC中检索成绩为空值的学生学号和课程号。
C#
GRADE
IS
NULL;
7
检索姓名以L打头的所有学生的姓名和年龄。
SNAME,
AGE
LIKE
’L%’;
8
求年龄大于女同学平均年龄的男学生姓名和年龄。
SEX=’M’
AGE>
SEX=’F’);
9
求年龄大于所有女同学年龄的男学生姓名和年龄。
习题3.12
试用SQL更新语句表达对3.2题教学数据库中关系S、SC、C的更新操作:
1
往关系C中插一个课程元组('
C8'
,'
VC++'
BAO'
)。
INSERT
INTO
C
VALUES('
);
检索所授每门课程平均成绩均大于80分的教师姓名,并把检索到的值送往另一个已存在的表FACULTY(TNAME)。
INSERT
FACULTY(TNAME)
SELECT
DISTINCT
TEACHER
(SELECT
TEACHER,
C.C#,
AVG(GRADE)
BY
TEACHER,
C.C#)
AS
RESULT(TEACHER,
C#,
AVG_GRADE)
X
80<
=ALL(SELECT
AVG_GRADE
FROM
RESULT
Y
WHERE
Y.TEACHER=X.TEACHER);
③在SC中删除尚无成绩的选课元组。
DELETE
把选修LIU老师课程的女同学选课元组全部删去。
DELETE
S#
IN(SELECT
S
WHERE
SEX='
F'
)
C#
C#
C
TEACHER='
LIU'
把MATHS课不及格的成绩全改为60分。
UPDATE
SET
GRADE=60
GRADE<
60
AND
C#
IN(SELECT
C#
CNAME='
MATHS'
把低于所有课程总平均成绩的女同学成绩提高5%。
UPDATE
SET
GRADE=GRADE*1.05
IN(SELECT
SC);
在表SC中修改C4课程的成绩,若成绩小于等于70分时提高5%,若成绩大于70
分时提高4%(用两种方法实现,一种方法是用两个UPDATE语句实现,另一种方法是用带CASE操作的一个UPDATE语句实现)。
GRADE=GRADE*CASE
WHEN
GRADE>
70
THEN
1.04
ELSE
1.05
END
C#='
C4'
;
⑧
在表SC中,当某个成绩低于全部课程的平均成绩时,提高5%。
习题3.13
设数据库中有三个关系:
职工表
EMP(E#,ENAME,AGE,SEX,ECITY),
其属性分别表示职工工号、姓名、年龄、性别和籍贯。
工作表
WORKS(E#,C#,SALARY),
其属性分别表示职工工号、工作的公司编号和工资。
公司表
COMP(C#,CNAME,CITY),
其属性分别表示公司编号、公司名称和公司所在城市。
试用SQL语句写出下列操作:
用CREATE
TABLE语句创建上述三个表,需指出主键和外键。
CREATE
TABLE
EMP
E#
CHAR(4)
NULL,
ENAME
CHAR(8)
NULL,
(2003/9/21)
(GJ-DA)
(共2页)
目录--36
SMALLINT,
SEX
CHAR
(1),
ECITY
CHAR(20),
PRIMARY
KEY(E#));
COMP
CNAME
CHAR(20)
CITY
KEY(C#));
WORKS
SALARY
KEY(E#,
C#),
FOREIGN
KEY(E#)
REFERENCES
EMP(E#),
KEY(C#)
COMP(C#));
检索超过50岁的男职工的工号和姓名。
E#,
50
假设每个职工只能在一个公司工作,检索工资超过1000元的男性职工工号和姓名。
EMP.E#,
EMP,
EMP.E#=WORKS.E#
SALARY>
1000;
假设每个职工可在多个公司工作,检索在编号为C4和C8公司兼职的职工工号和姓名。
A.E#,
A.ENAME
B,
A.E#=B.E#
B.E#=C.E#
B.C#='
C.C#='
检索在“联华公司”工作、工资超过1000元的男性职工的工号和姓名。
B.C#=C.C#
联华公司'
1000
假设每个职工可在多个公司工作,检索每个职工的兼职公司数目和工资总数.显示(E#,NUM,SUM_SALARY),分别表示工号、公司数目和工资总数。
AS
NUM,
SUM(SALARY)
SUM_SALARY
E#;
工号为E6的职工在多个公司工作,试检索至少在E6职工兼职的所有公司工作的职工工号。
X.E#
X
Y
E#='
E6'
Z
Z.E#=X.E#
Z.C#=Y.C#));
检索联华公司中低于本公司平均工资的职工工号和姓名。
SALARY<
AVG(SALARY)
WORKS,
WORKS.C#=COMP.C#
⑨在每一公司中为50岁以上职工加薪100元(若职工为多个公司工作,可重复加)。
SALARY=SALARY+100
IN
50);
10
在EMP表和WORKS表中删除年龄大于60岁的职工有关元组。
60);
60;