欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

查询选了所有课的学生姓名(自己的一点小理解)

程序员文章站 2024-02-28 12:11:16
...
SELECT Sname FROM Student
WHERE NOT EXISTS(
		SELECT * FROM Course
		WHERE NOT EXISTS(
				SELECT * FROM SC
				WHERE Sno=Student.Sno AND Con=Course.Con));

SELECT Name FROM Student 是从Student 表中一个元组一个元组地查询符合WHERE条件的学生姓名;

最内层

    SELECT * FROM SC 
    WHERE Sno = Student.Sno AND Cno = Course.Cno

是查询学号为Sno的学生选课的情况,生成一个学号为Sno学生和其所选课程信息的结果表;

次外层

    SELECT * FROM Course

    WHERE NOT EXISTS (

                   SELECT * FROM SC 

                   WHERE Sno = Student.Sno AND Cno = Course.Cno)

从Course 表中一个元组一个元组地查询,若WHERE 返回true(最内层的查询结果为空,即没有选此门课)则将此元组(课程信息)放入结果表中,若为false(上层查询结果不为空,即选了此门课)则不放入;

最外层

    SELECT Name FROM Student

    WHERE NOT EXISTS (

             SELECT * FROM Course

             WHERE NOT EXISTS (

                          SELECT * FROM SC 

                          WHERE Sno = Student.Sno AND Cno = Course.Cno));

若WHERE返回true(Course结果表为空,即选了所有课)则将Student表的元组中的Sname(即当前查询的学生姓名)放入最终结果表中;所WHERE返回false(Course结果表不为空,即有没选的课)则不放入最终结果表中。

最后查询的即为选了所有课的学生的姓名。

相关标签: 个人学习