v1.0 可编辑可修改
【】设教学数据库中有4个关系: 教师关系 T(T#,TNAME,TITLE) 课程关系C(C#,CNAME,T#) 学生关系S(S#,SNAME,AGE,SEX) 选课关系 SC(S#,C#,SCORE) 试用SQL查询语句表示下列查询。 解:
①检索年龄小于17岁的女学生的学号和姓名。 SELECT S#.SNAME FROM S
WHERE AGE<17 AND SEX=’F’
②检索男学生所学课程的课程号和课程名。 SELECT C.C#,CNAME (连接查询方式) FROM S,SC,C
WHERE S.S#=# AND #=# AND SEX=’M’; ③检索男学生所学课程的任课老师的工号和姓名。 SELECT #, TNAME FROM S,SC,C,T 6
v1.0 可编辑可修改 WHERE #=# AND #=# AND #=# AND SEX=’M’; ④检索至少选修两门课程的学生学号。 SELECT DISTINCT # FROM SC AS X, SC AS Y WHERE #=# AND #!=#;
⑤检索至少有学号为S2和S4的学生选修的课程的课程号。 SELECT DISTINCT # FROM SC AS X, SC AS Y
WHERE #=’S2’ AND #=’S4’ AND #=#; ⑥检索WANG同学不学的课程的课程号。 SELECT C# FROM C
WHERE NOT EXISTS (SELECT * FROM S, SC
WHERE #=# AND #=# AND SNAME=’WANG’); ⑦检索全部学生都选修的课程的课程号与课程名。 SELECT C#,CNAME FROM C
WHERE NOT EXISTS (SELECT * FROM S
WHERE NOT EXISTS (SELECT * FROM SC
WHERE S#=# AND C#=#));
⑧检索选修课程包含LIU老师所授全部课程的学生学号。 7
v1.0 可编辑可修改 法一:
SELECT DISTINCT S# FROM SC AS X WHERE NOT EXISTS (SELECT * FROM C,T
WHERE #=# AND TNAME=’LIU’ AND NOT EXISTS (SELECT{ FROM SC AS Y
WHERE #=# AND #=#)); 法二:
SELECT DISTINCT S# FROM SC X WHERE NOT EXISTS ((SELECT C# FROM C,T WHERE #=# AND TNAME='LIU’) EXCEPT
(SELECT C# FROM SC Y WHERE #=#));
【3.7】试用SQL查询语句表达下列对第3.2题中4个基本表T、C、S、SC的查询。 ①统计有学生选修的课程门数。 SELECT COUNT(DISTINCT C#) FROM SC; ②求选修C4课程的女学生的平均年龄。 SELECT AVG(AGE) FROM S,SC
WHERE S.S#=SC.S# AND C#=’C4’ AND SEX=’F’: 8
v1.0 可编辑可修改 ③求LIU老师所授的每门课程的平均成绩。 SELECT C.C#.AVG(SCORE) FROM SC,C,T
WHERE SC.C#=C.C# AND C.T#=T.T# AND TNAME=’LIU’ GROUP BY C.C#;
④统计选修每门课程的学生人数(超过l0人的课程才统计)。要求显示课程号和人数,查询结果按人数降序排列,若人数相同,则按课程号升序排列。 SELECT C#.COUNT(S#) FROM SC GROUP BY C# HAVING COUNT(*)>10 ORDER BY 2 DESC,1;
⑤检索学号比WANG同学大,而年龄比他小的学生姓名。 SELECT SNAME FROM S
WHERE S#>ALL(SELECT S# FROM S WHERE SNAME=’WANG’) AND AGE WHERE SNAME=’WANG); ⑥在表SC中检索成绩为空值的学生的学号和课程号。 SELECT S#, C# FROM SC WHERE SCORE IS NULL; ⑦检索姓名以L开头的所有学生的姓名和年龄。 SELECT SNAME, AGE FROM S 9 v1.0 可编辑可修改 WHERE SNAME LIKE ’L%’; ⑧求年龄大于女同学平均年龄的男学生的姓名和年龄。 SELECT SNAME, AGE FROM S WHERE SEX=’M’ AND AGE>(SELECT AVG(AGE) FROM S WHERE SEX=’F’); ⑨求年龄大于所有女同学年龄的男学生的姓名和年龄。 SELECT SNAME, AGE FROM S WHERE SEX=‘M’ AND AGE>ALL(SELECT AGE FROM S WHERE SEX=’F’); 【3.12】 解: ①INSERT INTO C VALUES(‘C8’,’VC++’,’T6’); ② 法一: INSERT INTO FACULTY(TNAME) SELECT DISTINCT TNAME FROM (SELECT TNAME,C.C#,AVG(SCORE) FROM T, C, SC 10