SQL中利用exists查询选修了全部课程的同学

SQL利用exists查询选修了全部课程的同学

最近在做数据库实验,碰到了“查询选修所有课程”的问题,题目如下(基于《数据库系统概念第六版》大学模式):

查询学号最后两位为09且至少选修了A同学2015020101(学号)选修的全部课程的学生的学号与姓名,按学号排序。

通常做法是“取反面”,即: 没有一门 A同学选择的课程 没有被该学生选择
初看可能很绕,下面是自己的理解
[双重否定即为肯定,需要从外到内理解SQL语句]

-- 1.选定某一个学生
select ID, NAME
from STUDENT t1
where ID like '%09' and not exists ( -- 2.没有一门 A同学选择的课程……
-- (“没有一门”用“not exists”表示,则以下即为“A同学选择的课程”)
    select COURSE_ID
    from TAKES t2
    where ID = '2015020101' and not exists ( -- 3.以上课程没有被该同学选择
    -- (“没有被”用“not exists”表示,以下即为“以上课程被该学生选择”)
        select ID
        from TAKES t3
        where t1.ID = t3.ID and t2.COURSE_ID = t3.COURSE_ID
    )
)
order by ID;

SQL中利用exists查询选修了全部课程的同学_第1张图片
SQL中利用exists查询选修了全部课程的同学_第2张图片

你可能感兴趣的:(Database,数据库,oracle)