CDA考试专区 加入小组

1000个成员 594个话题 创建时间:2017-12-06

有关系S(SNO, SNAME, SDEPT,SAGE),C(CNO, CNAME),SC(SNO, CNO, GRADE)。其中SNO是学生号,SNAME是学生姓名,SDEPT是系别

发表于2024-04-18 785次查看

有关系S(SNO, SNAME, SDEPT,SAGE),C(CNO, CNAME),SC(SNO, CNO, GRADE)。其中SNO是学生号,SNAME是学生姓名,SDEPT是系别,SAGE是学生年龄,CNO是课程号,CNAME是课程名称,GRADE是成绩。要查询“计算机”系的没有不及格成绩的学生学号和姓名

A.    SELECT Sno, Sname FROM S WHERE Sdept='计算机’ INTERSECT SELECT Sno, Sname FROM SC WHERE GRADE>=60;

B.    SELECT Sno, Sname FROM S WHERE Sdept='计算机’ and Sno not in (SELECT SNO FROM SC WHERE GRADE<60);

C.    SELECT Sno, Sname FROM S WHERE Sdept='计算机’ EXCEPT SELECT SNO FROM SC WHERE GRADE<60;

D.    SELECT Sno, Sname FROM S WHERE Sdept='计算机’ and SNO in (SELECT SNO FROM SC WHERE GRADE>=60);

参考答案: B

解析:第一步先查询成绩不及格的学生学号:SELECT SNO FROM SC WHERE GRADE<60;将第一步的查询结果作为筛选条件,第二步再查询满足条件的记录,即“计算机”系且成绩及格的学生学号和姓名,因此正确答案为B选项。

1回复
  • 2楼 CDA148972 3天前

    这个题出的很有意思。我来补充一下, 关于B和D的区别。  

    B中的逻辑是: 不在 (不及格的范围内), 蕴含的信息(包含了两类人):

    1、所有科目都及格了,全pass的人

    2、没有参加考试的人。  是的,你没有看错,没有成绩的人也被select出来了。

    结论:  让你统计一个全科及格的人的信息。 你这样统计, 让没参加考试的人也ok了

     

    D中的逻辑是: 在 (及格范围内),蕴含的信息:

    1、参加考试的人, 没有了B中的BUG( 不参加考试也算全科通过)

    2、只要有一门PASS即可,是的,你没有看错,只要一门即可,而不是全科pass。

    结论: 得到一个参加考试的人中,只要单门通过的即可。

     

    那么,如果要你统计一个参加考试 且 全科通过的信息呢?

    SELECT S.* FROM S right join SC on S.sno=SC.sno WHERE S.Sdept='计算机’ and S.Sno not in (SELECT SNO FROM SC WHERE GRADE<60);

发表回复
你还没有登录,请先 登录或 注册!
话题作者
一站式数据科学在线教育平台