4个关系
教师关系 T(T#,TNAME,TITLE)
课程关系 C(C#,CNAME,T#)
学生关系 S(S#,SNAME,AGE,SEX)
选课关系 SC(S#,C#,SCORE)
1.检索年龄小于17岁的女学生的学号和姓名
SELECT S#,SNAME
FROM S
WHERE AGE<17 AND SEX='F' --很简单的一个判断条件
2.检索男学生所学课程的课程号和课程名
SELECT C.C#,CNAME
FROM S,C,SC --需要的条件各在三个表里所以三个表自然连接然后筛选就行
WHERE SEX='M' AND SC.C#=C.C# AND SC.S#=S.S#
3.检索男学生所学课程的任课老师的工号和姓名
SELECT DISTINCT T.T#,TNAME
FROM S,C,SC,T --这几条信息都是在四个表中所以我们将四个表自然连接最后在筛选就行了
WHERE SEX='M' AND SC.C#=C.C# AND SC.S#=S.S# AND C.T#=T.T#
4.检索至少选修两门课程学生的学号
SELECT DISTINCT S#
FROM SC
GROUP BY S# --直接按照学号分组然后筛选出选修课程数大于2的课程
HAVING COUNT(C#)>2
当然也可以将两个SC表做笛卡尔积然后要求两者的C#不相等即可具体代码不做说明
5.检索至少有学号S2和S4学生选修的课程的课程号
SELECT DISTINCT X.C#
FROM SC AS X,SC AS Y --做自然连接然后找出S2和S4即可
WHERE X.S#='S2'AND Y.S#='S4'
6检索WANG同学不学的课程
SELECT DISTINCT C#
FROM SC,S --先自然连接然后再进行条件的筛选检索很简单
WHERE SC.S#=S.S# AND S.S# NOT IN(SELECT S#
FROM S
WHERE SNAME ='WANG')
7.检索全部同学都选修的课程的课程号和课程名
SELECT DISTINCT C#,CNAME
FROM C --改成双重否定即没有一个学生不选这就是两个不存在语句的写法
WHERE NOT EXISTS (SELECT *
FROM S
WHERE NOT EXISTS(
SELECT *
FROM SC
WHERE SC.S#=S.S# AND SC.C#=C.C#) )
8.检索选修课程包含LIU老师所授全部课程的学生学号
SELECT DISTINCT S#
FROM SC AS X
WHERE NOT EXISTS (SELECT *
FROM C,T
WHERE C.T#=T.T# AND TNAME ='LIU' AND NOT EXISTS(SELECT *
FROM SC AS Y
WHERE X.S#=Y.S# AND Y.C#=C.C#))
在选课的学生中找一个他和LIU老师教的课程的组合应该会在SC中出现然后反着写加两个NOT EXISTS即可 即他和LIU老师教的课程的组合不会不存在在选课的表中。