回 帖 发 新 帖 刷新版面

主题:[讨论]SQL问题,高手请进

最近在做一个学生成绩管理系统,还是那四张表:
class(clno C(8),clname C(14),number N(2),monitor C(10)) 
这是班级表,分别有班号,班名,班级人数,班长学号字段;
student(sno C(10),sname C(12),ssex C(2),sage N(2),clno C(8))
这是学生表,分别有学号,姓名,性别,年龄,班号等字段;
course(cno C(2),cname C(24),precno C(2)) 
这是课程表,分别有课号,课名,先修课课号等字段;
sc(sno C(10),cno C(2),score N(5,1))
 这是学生选课及成绩表,分别有学号,课号,成绩等字段。

要求写SQL查询语句,求出只选修了学生胡成晶所选全部课程的学生的学号及姓名,这个问题特复杂,我想了两周都没想出答案,我估计本论坛没几个人能做出来,所以来这里只是碰碰运气,或许那位大虾能帮忙呢?

另外,我注意到本论坛有几位高手, 架吵得出神入化, 我估计VFP的学术造旨也不会低,请高手们在吵闹之余,换换脑筋,帮在下解答一二,拜托了![em1]

回复列表 (共19个回复)

11 楼

[b]#9楼 [/b]

勿气... 我也是刚过来这论坛....看到注册时间=。=

刚看到这问题,再看看你代码....别说他晕。。我先懒得看了

一般正常写程序

过长的select语句,我都会把去拆分 毕竟程序是给人的

当然如果程序只是你自己看,自己维护 那你可以直接无视我.

如果是为了日后维护,或其他程序员接手,至少人家能够快速清晰的看懂你写的是什么

更何况对于楼主来说你一步到位的代码...你觉得他能看懂么,

如果他仅仅是为了完成任务,你的做法是完全可取的,因为那就是他想要的..

如有冒犯,请多包涵

12 楼

1。先明确一点,论坛里解答人是对问题人负责,不可能对所有人(水平不同且很难鉴别)负责。也就是说这里是‘特长教育’,不是‘普适’教育

2。论坛里应该是人人平等的,表现在问答上就是不要把问题人当‘孩子’进行循循善诱的引导。特殊地,对什么也不会的初学者进行循循善诱的授渔你能玩的起吗?

3。低估别人的理解能力是不礼貌的——我是这样认为的。人家要什么我就给什么(当然是在能给的起的情况下),没必要画蛇添足

4。这里不存在授鱼还是授渔的问题。
       也许人家可能一时进了牛角尖只需要个‘点到’使其‘惊醒’就够了
       如果人家真理解不了可以再问的,我们再解释也来得急

5。‘懒得看’与‘看不懂’是两回事。
       对‘懒得看’的,人家不愿深究,我说那么多有用吗?
       对‘看不懂’的,他(她)可以接着问,如果没再问,我怎么知道他(她)是不是‘懒得看’的?

13 楼

不同意ls观点……因为这样会变成求作业专区……人气再高有啥意义

14 楼

谢谢各位大侠关注本贴并给予的帮助和支持.我不一一回贴,只以分数来说明我的满意程度(暂且这么说,其实这样说不礼貌,一时想不到更好的表达方法)

15 楼

四楼贴子没给满分,确是因为我看不太懂.而不是不太正确.我以前只学过SQL嵌套有在where子句中有,后来又知道了VFP也支持在from子句中置嵌套,现在从四楼看到了在select子句中了可以有嵌套,我还未及验证,是不是四楼大侠的句子已经运行通过了?

16 楼

五楼虽没有具体的句子,但思路很清晰,对我启发很大,所以我给了满分.

17 楼


vfp9:

CREATE CURSOR sc (sno c(2), cno c(2), G c(1))
*!*                    学号  ,课号  ,成绩
INSERT INTO sc VALUES ('s1', 'c1', 'A')
INSERT INTO sc VALUES ('s1', 'c2', 'A')
INSERT INTO sc VALUES ('s1', 'c3', 'A')
INSERT INTO sc VALUES ('s1', 'c5', 'B')
INSERT INTO sc VALUES ('s2', 'c1', 'B')
INSERT INTO sc VALUES ('s2', 'c2', 'C')
INSERT INTO sc VALUES ('s2', 'c4', 'C')
INSERT INTO sc VALUES ('s3', 'c3', 'C')
INSERT INTO sc VALUES ('s3', 'c4', 'B')
INSERT INTO sc VALUES ('s4', 'c3', 'B')
INSERT INTO sc VALUES ('s4', 'c5', 'D')
INSERT INTO sc VALUES ('s5', 'c2', 'C')
INSERT INTO sc VALUES ('s5', 'c3', 'B')
INSERT INTO sc VALUES ('s5', 'c5', 'B')
INSERT INTO sc VALUES ('s6', 'c4', 'A')
INSERT INTO sc VALUES ('s6', 'c5', 'A')
INSERT INTO sc VALUES ('s3', 'c2', 'B')
INSERT INTO sc VALUES ('s1', 'c4', 'B')
INSERT INTO sc VALUES ('s7', 'c1', 'A')
INSERT INTO sc VALUES ('s7', 'c2', 'C')
INSERT INTO sc VALUES ('s7', 'c4', 'B')

CREATE CURSOR s (sno c(2), sn c(2), sd c(2), sa i)
*!*                  学号,   姓名, 所属系, 年龄
INSERT INTO s VALUES ('s1', 'A1', 'CS', 20)
INSERT INTO s VALUES ('s2', 'B1', 'CS', 21)
INSERT INTO s VALUES ('s3', 'C1', 'MA', 19)
INSERT INTO s VALUES ('s4', 'D1', 'CI', 19)
INSERT INTO s VALUES ('s5', 'E1', 'MA', 20)
INSERT INTO s VALUES ('s6', 'F1', 'CS', 22)
INSERT INTO s VALUES ('s7', 'X1', 'CS', 22)

CREATE CURSOR c (cno c(2), cn c(2), pcno c(2))
*!*                  课号,   课名, 先行课号
INSERT INTO c VALUES ('c1', 'G2', '-')
INSERT INTO c VALUES ('c2', 'H2', 'C1')
INSERT INTO c VALUES ('c3', 'I2', 'C1')
INSERT INTO c VALUES ('c4', 'J2', 'C2')
INSERT INTO c VALUES ('c5', 'K2', 'C4')

*!*    1.现用SQL语言查询选修了“1”,“3”,“5”三门课程的学生姓名
*!*    select sno, sn ;
*!*        from s ;
*!*        where sno in (select sno from sc where cno='c1') and ;
*!*              sno in (select sno from sc where cno='c3') and ;
*!*              sno in (select sno from sc where cno='c5')
*!*    *!*    or
select a.sno, a.sn ;
    from s a, ;
         (select sno from sc where cno='c1') b, ;
         (select sno from sc where cno='c3') c, ;
         (select sno from sc where cno='c5') d ;
    where a.sno=b.sno and b.sno=c.sno and c.sno=d.sno


*!*    2.要求写SQL查询语句,求出只选修了学生B1所选全部课程的学生的学号及姓名,
select b.sno, (select sn FROM s WHERE b.sno=s.sno) sn ;
    from (select COUNT(*) cs2 FROM sc a, s b WHERE a.sno=b.sno AND b.sn='B1') a, ;
         (select sno, COUNT(*) cs ;
              FROM (select b.sno, b.cno ;
                        from sc a, sc b ;
                        where a.cno=b.cno and a.sno='s2' and a.sno!=b.sno) a ;
                        GROUP BY sno) b, ;
         (select sno, COUNT(*) cs1 from sc GROUP BY sno) c ;
    where b.cs = a.cs2 AND (b.sno=c.sno AND b.cs = c.cs1) 

18 楼

非常感谢狐说八道先生的解答!
select count(*) from sc where sno = (select sno from student where sname = '胡成晶')
这一句查询出胡成晶同学的选课门数;
select cno from sc where sno = (select sno from student where sname = '胡成晶') 
这一句查出胡成晶选修的所有课程的全部课号
select cno from course where cno not in (select cno from sc where sno = (select sno from student where sname = '胡成晶'))
这一句选出所有胡成晶未选的课号

select sno,sname from student where sno in;
( select sno from sc where cno in ;
 (select cno from sc where sno = (select sno from student where sname = '胡成晶'));
and cno not in;
 (select cno from course where cno not in (select cno from sc where sno = (select sno from student where sname = '胡成晶'));
and (select count(*) from sc where sno=s.sno)=select count(*) from sc where sno = (select sno from student where sname = '胡成晶');
))

上列句子就是我根据大家的贴子总结出来的句子,不知道我理解得对不对?

19 楼

sorry,有个地忘改了:
                        from sc a, sc b ;
                        where a.cno=b.cno and a.sno='s2' and a.sno!=b.sno) a ;
换成:
                        from sc a, sc b, s c ;
                        where a.cno=b.cno and (c.sn='B1' AND a.sno=c.sno) and a.sno!=b.sno) a ;

*!*    4.要求写SQL查询语句,求出只选修了学生B1所选全部课程的学生的学号及姓名,
select b.sno, (select sn FROM s WHERE b.sno=s.sno) sn ;
    from (select COUNT(*) cs2 FROM sc a, s b WHERE a.sno=b.sno AND b.sn='B1') a, ;
         (select sno, COUNT(*) cs ;
              FROM (select b.sno, b.cno ;
                        from sc a, sc b, s c ;
                        where a.cno=b.cno and (c.sn='B1' AND a.sno=c.sno) and a.sno!=b.sno) a ;
              GROUP BY sno) b, ;
         (select sno, COUNT(*) cs1 from sc GROUP BY sno) c ;
    where b.cs = a.cs2 AND (b.sno=c.sno AND b.cs = c.cs1) 

我来回复

您尚未登录,请登录后再回复。点此登录或注册