数据库系统概论之嵌套查询中的带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 fromstudent;接着用谓词exists连接最外层表和中间层表(最内层表),即where exists ();这时,由于最内层表和中间层表是同一张表,所以exists的括号内要做两件事:满足条件的选择语句、进行表的连接。即select * from sc where sno=student.sno and cno=’1‘。这样这题也就做完了。
示例二:
分析:这题和上面那题相似,不细讲了。过程也是一样的,就是把exists换成了not exists,其他地方不用变。这种题就先把他当做肯定来做,写出含exists的sql语句,再把exists换成not exists,其他地方不变。
示例三:
分析:上面概述中讲到exists代表存在量词。示例一和示例二都是存在量词的例子。这题是全称量词的例子。那么怎么判断题目是全称量词还是存在量词叙述呢:就看叙述的谓语后面是否紧跟着“全部”,“所有”这类的全称量词。此题中谓语选修后面紧跟着全部,所以是全称量词。(每道题目叙述中都有查询这两个字,可以不看这两个字,那么选修是谓语就很好理解。我不知道怎么跟你们解释谓语,可能我语文太差了。我是这种题目做多了,拿到题目就能看出来要用exists还是not exists。按照上面的解题模式多练,你们也能很快看出来)那就要把全称量词转换成存在量词。这种转换在离散数学里面也很常见,没学离散数学的也不用急,我会在博客后面列出常见的全称量词转存在量词的例子。
这里按照语义我们会将他转换为:没有一门课该同学不选修。那么这里就涉及到了3张表:student表,course表,sc表。为什么比示例一多了course表呢。因为这里是选修了全部课程,涉及到全部课程那就要用到course表。上面叙述中包含了“没有”,“不”这两个否定词,所以要用两个not exists。这就是标准的解题模式了。
最外层表:student表
中间层表:course表
最内层表:sc表
按照解题模式中的步骤则可以很快写出答案。这里我就不一步一步分析了,跟上面的步骤是一样的。
示例四:
分析:首先把全称量词转换成存在量词,转换完之后的步骤上面的是一样的。这里不细讲了,读者可以结合上面的解题过程自己写出来。
下面总结一些上面涉及到的全称量词转存在量词的问题:
1、一般全称量词转成存在量词后都会有否定词,而且一般是两个。所以这种一般要用到2个not exists。
2、离散数学中的全称量词和存在量词:
3、二者之间的转换:
四、总结:
1、讲到这里,关于(not)exists的难点和解题方法都已经讲完了,对付考试不成问题,而且考试一般不会考这么难的。国家计算机等级考试中可能会出这样的题,但只要按照上面的解题步骤还是可以很快做出来的。
2、当时学到这里的时候,我也是感觉很难,题目做不出来。我们期末考试没考这样的题,但老师会出这样的题给我们做。于是我就网上找题目练,练多了就知道怎么做了,也总结了上面的做题步骤,感觉做起来更加快速。
3、可能有人会把这类题与嵌套中的in混淆,书上给出的解释:一些带 EXISTS或 NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换,但所有带IN谓词、比较运算符、ANY和ALL谓词的子查询都能用带 EXISTS谓词的子查询等价替换。具体区别体现在下面,题做多了自然也就能看出来。
4、上面所举例子来自 数据库系统概论第五版 王珊,全称量词的转换来自离散数学第五版 耿素云。因为我在PDF上做了笔记和一些标记,不方便分享,你们可以自己从网上下载。
最后:原创码字不易,博客写的很认真。请大家多多点赞,多多分享,新人求一波关注。如有帮助到大家,请点赞不要白嫖哦,记得素质三连(点赞,关注,分享)。转载时请注明出处。
第一篇博客(数据库系统概论之关系代数中的除法)传送门:数据库系统概论之关系代数中的除法