关于SQL语句的两个NOT EXISTS的用法

近日笔者在复习数据库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老师课程的人最后在查找学号即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用编程写诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值