查询选修了所有课程的学生的学号,姓名,年龄
select sno,sname,datediff(YYYY,birthdate,getdate()) 年龄
from studentwhere not exists(select * from course where not exists(select * from sc where sno=student.sno and SC.CNo=course.cno));
这个查询,查出的是选择全部课程的学生的姓名。
对于这个语法,要分步理解,从最下边的where看起,从下往上去看。最下边的一个select(not exists后边)是把学生编号和课程编号带入,结果是查询学生选课的记录。加上not exists,就是学生没选课,那么加上前边的从课程表的select,就是查询出学生没选的课程。最后在上面又加了一个not exists,那么就是不存在没选课程的数据,也就是说,这个学生选择了所有的课程,才会符合记录。这么说能明白么?看我下边分的段----------------以下查询选择全部课程学生的姓名SELECT SnameFROM StudentWHERE NOT EXISTS --------此处不存在配合以上STUDENT,可知查询的是不存在没选课的学生----------------以下查询学生没选课的信息(SELECT *FROM CourseWHERE NOT EXISTS -------此处增加不存在,配合上面从COURSE的选择可知查询的是学生没有选的课----------------以下查询查询学生选课的信息(SELECT *FROM SCWHERE Sno = Student.Sno AND Cno = Course.Cno));