hjack 发表于 2006-1-17 23:50

[讨论]一道数据库题

据说是去年期未的数据库考试题.

三张表如下:
S(SNo,SName,SSex,SAge,SDept);
C(CNo,CName,CPno,CE);//CE为学分
SC(SNo,CNo,Grage);

问题:
求不选修这门课程的男生姓名,这门课程先行课为'OS',这门课学分为4.

wool王 发表于 2006-1-17 23:52

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 编辑 ]

hjack 发表于 2006-1-17 23:56

创建表的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表.应该还有其它方法的.

hjack 发表于 2006-1-18 00:06

要注意的是,没有选修的同学也要查询出来,
就像上面的E同学那样,没有选课,但也是符合条件的哦.
页: [1]
查看完整版本: [讨论]一道数据库题