一、【问题描述】
用SQL语句完成下列数据查询操作
1.查询至少有一门课与学号为’0700001’的学生所学相同的学生的学号和姓名。
2.查询至少选修了学号为“0700001”学生所选修的所有课程的学生姓名。
二、【问题解答】
问题解析:因为在第一题的要求中是要查询至少有一门课与学号为‘0700001’的学生相同的学生学号和姓名,因此查询的结果中学生只要有一门课程或者一门课程以上选修的与‘0700001’的学生相同即可,所以只要先查询出‘0700001’学生所选修的课程的课程号,然后再对比看看哪些学生选修的课程的课程号与他相同,很容易想到SQL语句中要用上IN。
SQL语句如下:
select distinct studentName,Student.studentNo
from Student,Score
where Student.studentNo=Score.studentNo and courseNo in(select courseNo from Score where studentNo='0700001')
问题解析:在第二题中的要求是要查询出至少选修了学号为“0700001”学生所选修的所有课程的学生姓名,注意这里的至少,分析题意就是所查询的学生选修了学号为‘0700001’的全部课程或者除了选修他的全部课程,也可以选修了多余的课程,但是至少是要选修了他选修的全部课程的。在SQL中没有全称量词,因此要解决这个问题就要用上否定的否定,就要用到not exists
SQL语句如下:
select distinct studentName from Student,Score X
where Student.studentNo=X.studentNo and not exists(select * from Score Y where Y.studentNo='0700001' and not exists(select *from Score z where
z.studentNo=X.studentNo and z.courseNo=Y.courseNo))
其实以上SQL代码的核心是:
select *
from Score X,Score Y,Score z
where z.courseNo=Y.courseNo and
z.studentNo=X.studentNo