注册 登录
编程论坛 SQL Server论坛

谁帮忙解决一下!谢谢!

张汉卿 发布于 2010-04-09 21:35, 596 次点击
在学生信息表S中检索每一门课程成绩都大于等于80分的学生学号姓名性别
SELECT     SC.学号, S.姓名, S.性别
FROM         S INNER JOIN
                      SC ON S.学号 = SC.学号
WHERE     EXISTS
                          (SELECT     学号, 课程号, 成绩
                            FROM          SC AS SC_1
                            WHERE      成绩 >= 80 AND S.学号 =SC.学号)和 下面这个有什么不同啊,为什么检索出来的结果不一样啊,EXISTS  和  NOT EXISTS 是相反的意思  结果应该一样啊   
SELECT     SC.学号, S.姓名, S.性别
FROM         S INNER JOIN
                      SC ON S.学号 = SC.学号
WHERE  NOT EXISTS   
                          (SELECT     学号, 课程号, 成绩
                            FROM          SC AS SC_1
                            WHERE      成绩 < 80 AND  S.学号 = SC.学号)
3 回复
#2
cnfarer2010-04-10 07:22
其实逻辑问题:
第1个:查找存在成绩>=80学生的信息(只要有一门课成绩>=80就符合条件)
第2个:查找不存在成绩<80学生的信息(只要有一门课成绩<80就不符合条件,当然这个就是符合条件的查询)
#3
MIQIKing2010-04-10 07:31
第一种
检索出来的是,只要有一科成绩在80分以上。
第二种
检索出来的是,只要有一科成绩在80分以下就不检索出来。
换种说法是:每科成绩都得在80分以上才能被检索出来。

举个例子
学号   课程号    分数
S1      C1        60
S1      C2        90
S2      C1        70
S2      C2        94
S3      C1        85
S3      C2        90
S4      C1        10
S4      C2        20

按照第一种因为S1的C2大于80符合条件;S2的C2也符合条件;S3的都符合;S4都不符合;查询结果应为S1,S2,S3所对应的学生信息;
按照第二种因为S1的C1小于80不符合条件;同理S2,S4也不符合;只有S3每科都大于80分;查询结果应为S3的学生信息;

用EXISTS查询时在接下来的()中用的SELECT 不用写那么多列的。因为EXISTS代表存在量词,子查询不返回任何实际数据的,只返回逻辑的真值TRUE或者假值FALSE。通常情况下吧,都用*。
#4
张汉卿2010-04-10 10:05
回复 3楼 MIQIKing
检索全部学生都选修的课程的课程号和课程名   (数据表C 是课程数据表   S  是 学生基本信息表  SC  是学生选课数据表)
SELECT 课程号,课程名  FROM  C
   WHERE  NOT  EXTSTS
           (SELECT * FROM S
           WHERE  NOT  EXTSTS
                (SELECT  *  FROM SC
                    WHERE SC.学号=S.学号  AND  SC.课程号=C.课程号))   
    我不明白这是一个什么样的逻辑 请你帮我解释一下。谢谢!
1