近日笔者在复习数据库SQL语句部分时发现这个确实很绕,但是仔细进行思考过后其实还是很简单的。这个的一个方法就是进行双重否定,我们肯定在小学就学过了双重否定等于肯定了。那么这个就是利用这个思想将一个肯定的句式转换成一个双重否定的句式来实现利用两个NOT EXISTS来实现SQL语句的查询功能。
教师关系 T(T#,TNAME,TITLE)
课程关系 C(C#,CNAME,T#)
学生关系 S(S#,SNAME,AGE,SEX)
选课关系 SC(S#,C#,SCORE)
例子1:检索全部同学都选修的课程的课程号和课程名
SELECT DISTINCT C#,CNAME
FROM C --改成双重否定即没有一个学生不选这就是两个不存在语句的写法
WHERE NOT EXISTS (SELECT *
FROM S
WHERE NOT EXISTS( SELECT *
FROM SC
WHERE SC.S#=S.S# AND SC.C#=C.C#) )
在这个题中
SELECT *
FROM SC
WHERE SC.S#=S.S# AND SC.C#=C.C#)
这个查询语句是查询出学生选的课程所以在加上否定就是没有学生选的课程 没有什么样的学生呢
SELECT *
FROM S
WHERE
这一层的查询语句是查询出全部的学生
两个连接在一起就是查询出没有全部的学生都选的课再加上否定就是全部的学生都选的课也就是每一个同学都选修的课程。最后再查找课程号和课程名即可。
例子二:检索选修课程包含LIU老师所授全部课程的学生学号
SELECT DISTINCT S#
FROM SC AS X
WHERE NOT EXISTS (SELECT *
FROM C,T
WHERE C.T#=T.T# AND TNAME ='LIU' AND NOT EXISTS(SELECT *
FROM SC AS Y
WHERE X.S#=Y.S# AND Y.C#=C.C#))
在选课的学生中找一个他和LIU老师教的课程的组合应该会在SC中出现然后反着写加两个NOT EXISTS即可 即他和LIU老师教的课程的组合不会不存在在选课的表中。
SELECT *
FROM SC AS Y
WHERE X.S#=Y.S# AND Y.C#=C.C#))
查找出所有的选课的人加上否定就是所有没选课的人 没有选什么课呢
SELECT *
FROM C,T
WHERE C.T#=T.T# AND TNAME ='LIU'
这个就是查询出选LIU老师课程的人和上面连接起来就是没有选LIU老师课程的人。在加上否定就是说没有选LIU老师课程的人这个情况是不存在的也就是全都选了LIU老师课程的人最后在查找学号即可。