sql之嵌套查询中的带exists谓词的子查询

数据库系统概论之嵌套查询中的带exists谓词的子查询

一、exists谓词概述:exists谓词代表存在量词。带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。可以利用exists来判断属性与关系表之间的属于关系,关系表之间的包含、相等关系,关系表之间是否存在交集。

二、有关题型:题目给出文字叙述,要求我们写出sql语句。

解题方法:仔细读题,弄清所给条件和题目中涉及到了几张表

解题的一般模式:

(1)你要的结果的属性列来自的表(最外层表)

(2)满足题目条件的表(中间层表,只要把该表写出来,满足题目条件在最内层表的where子句中体现)

(3)产生关系的表(即执行连接操作,一般在最内层表里面进行所有连接操作。最内层表)

注意

1、可能只有2个select语句,也即一个exists谓词,在满足条件的表中同时产生关系,进行所有连接操作。这种一个exists谓词的sql查询是比较常见的。

2、可能有3个select语句,也即2个exists谓词,即遵循上面的解题模式。这种考的比较少,但只要根据上面给出的 解题模式还是能很快做出来的。

三、举例说明

示例一:
在这里插入图片描述
分析:仔细读题发现,题目中涉及到了2张表,为student表和sc表。选修1号课程即体现sc表,学生姓名即体现student表。这应该很好理解。接着按照上面的解题模式分析:我们要的属性是学生姓名,所以最外层表是student表。题目条件是“选修了1号课程”,很明显,有选修又要有课程号,那么满足题目条件的表就是sc表。这里只涉及到了两张表,所以只要一个exists就行,是那种简单的题型,即把解题模型中的第三步放到了第二步里面完成。当然,可以很明显看出来sc选修表也是产生关系的表(只有通过sc表,student表才能和course表连接)。上面又判断出了sc表是满足条件的表,即中间层表和最外层表是同一张表,那就用注意中说到的第一种方式解题。接下来我教大家怎么把sql语句写出来。从最外层表中直接查出结果属性列,先不管条件,即select sname from student;接着用谓词exists连接最外层表和中间层表(最内层表),即where exists ();这时,由于最内层表和中间层表是同一张表,所以exists的括号内要做两件事:满足条件的选择语句、进行表的连接。即select * from sc where sno=student.sno and cno=‘1’。这样这题也就做完了。

在这里插入图片描述
示例二:

在这里插入图片描述
分析:这题和上面那题相似,不细讲了。过程也是一样的,就是把exists换成了not exists,其他地方不用变。这种题就先把他当做肯定来做,写出含exists的sql语句,再把exists换成not exists,其他地方不变。

示例三:

在这里插入图片描述
分析:上面概述中讲到exists代表存在量词。示例一和示例二都是存在量词的例子。这题是全称量词的例子。那么怎么判断题目是全称量词还是存在量词叙述呢:就看叙述的谓语后面是否紧跟着“全部”,“所有”这类的全称量词。此题中谓语选修后面紧跟着全部,所以是全称量词。(每道题目叙述中都有查询这两个字,可以不看这两个字,那么选修是谓语就很好理解。我不知道怎么跟你们解释谓语,可能我语文太差了。按照常理也很容易判断是否是全称量词。)那就要把全称量词转换成存在量词。这种转换在离散数学里面也很常见,没学离散数学的也不用急,我会在博客后面列出常见的全称量词转存在量词的例子。

这里按照语义我们会将他转换为:“没有一门课该同学不选修”。那么这里就涉及到了3张表:student表,course表,sc表。为什么比示例一多了course表呢。因为这里是选修了全部课程,涉及到全部课程那就要用到course表。上面叙述中包含了“没有”,“不”这两个否定词,所以要用两个not exists。这就是标准的解题模式了。

最外层表:student表

中间层表:course表

最内层表:sc表

按照解题模式中的步骤则可以很快写出答案。这里我就不一步一步分析了,跟上面的步骤是一样的。
在这里插入图片描述
示例四:
在这里插入图片描述
分析:首先把全称量词转换成存在量词,即“不存在这样的课程y,学生201215122选修了y,而学生x没有选修”。转换也是两个否定词,那么就要用到两个not exists。题目要的是该生的学号sno,这里也不涉及到全部课程,那么就可以用一张(类)表sc来完成。
在这里插入图片描述

下面总结一些上面涉及到的全称量词转存在量词的问题

在这里插入图片描述
1、一般全称量词转成存在量词后都会有否定词,而且一般是两个。所以这种一般要用到2个not exists。

2、离散数学中的全称量词和存在量词:
在这里插入图片描述
3、二者之间的转换:


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、总结

1、讲到这里,关于(not)exists的难点和解题方法都已经讲完了,对付考试不成问题,而且考试一般不会考这么难的。国家计算机等级考试中可能会出这样的题,但只要按照上面的解题步骤还是可以很快做出来的。

2、当时学到这里的时候,我也是感觉很难,题目做不出来。我们期末考试没考这样的题,但老师会出这样的题给我们做。于是我就网上找题目练,练多了就知道怎么做了,也总结了上面的做题步骤,感觉做起来更加快速。只要按照上面的解题模式多练,就能掌握这类题目的做法。

3、可能有人会把这类题与嵌套中的in混淆,书上给出的解释:一些带 EXISTS或 NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带 EXISTS谓词的子查询等价替换。也就是说:这类题目有些可以用带in谓词的sql语句来做,但exists谓词的适用范围更广,有的时候不能被in谓词替代。具体区别体现在下面:

在这里插入图片描述

4、上面所举例子来自 数据库系统概论第五版 王珊,全称量词的转换来自离散数学第五版 耿素云。因为我在PDF上做了笔记和一些标记,不方便分享,你们可以自己从网上下载。

最后:原创码字不易,博客写的很认真。请大家多多点赞,多多分享,新人求一波关注。如有帮助到大家,请点赞不要白嫖哦,记得素质三连(点赞,关注,分享)。转载时请注明出处。

第一篇博客(数据库系统概论之关系代数中的除法)传送门:数据库系统概论之关系代数中的除法

在这里插入图片描述

  • 28
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值