[讨论]一道数据库题
据说是去年期未的数据库考试题.三张表如下:
S(SNo,SName,SSex,SAge,SDept);
C(CNo,CName,CPno,CE);//CE为学分
SC(SNo,CNo,Grage);
问题:
求不选修这门课程的男生姓名,这门课程先行课为'OS',这门课学分为4. select distinct S.SName from S,SC,C where
S.SNo <> SC.SNo and SC.CNo = C.CNo
and C.CE=4 and S.SSex=1
and C.CPno in (select CNo from C where CName = \'OS\')
这里加distinct是为了避免select出重复的记录
[ 本帖最后由 wool王 于 2006-1-17 16:36 编辑 ] 创建表的sql脚本:
CREATE TABLE . (
NOT NULL ,
(10) COLLATE Chinese_PRC_CI_AS NULL ,
NULL ,
NULL
) ON
GO
CREATE TABLE . (
NOT NULL ,
(10) COLLATE Chinese_PRC_CI_AS NULL ,
(10) COLLATE Chinese_PRC_CI_AS NULL ,
(10) COLLATE Chinese_PRC_CI_AS NULL ,
(10) COLLATE Chinese_PRC_CI_AS NULL
) ON
GO
CREATE TABLE . (
NOT NULL ,
NOT NULL ,
(10) COLLATE Chinese_PRC_CI_AS NULL
) ON
GO
S表的数据:
SNo SName SSex SAge SDept
1 A 1 19 计算机
2 B 1 20 计算机
3 C 1 21 软件工程
4 D 0 19 计算机
5 E 1 21 计算机
6 F 0 20 计算机
C表的数据:
CNo CName CPno CE
1 OS 2 4
2 C 3
3 DB 4 4
4 SE 2 4
5 XX 1 4
6 ww 1 4
SC表的数据:
SNo CNo Grage
1 5 88
2 3 76
3 2 33
查询语句:
select distinct SName from SC right outer join S on S.SNo=SC.SNo
where SSex=1 and CNo is null or CNo not in (
/*返回这门课程的课程号*/
select CNo from C
where CPno in (select CNo from C where CName=\'OS\' )
and CE=4
);
查询结果:
B
C
E
使用了右外连接,SC表右外连接S表.应该还有其它方法的. 要注意的是,没有选修的同学也要查询出来,
就像上面的E同学那样,没有选课,但也是符合条件的哦.
页:
[1]