第7期:数据库~查询中的EXISTS操作
Posted 易知识
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第7期:数据库~查询中的EXISTS操作相关的知识,希望对你有一定的参考价值。
(注:STUDENT、COURSE、SC表的具体情形在尾页!)
EXISTS:
EXISTS在逻辑上相当于存在量词ヨ。带有EXISTS的查询语句相当于一个逻辑判断语句,判断所包含语句的真假,返回逻辑真值(true)和假值(false)。
例如:查询所有选修1号课程的学生姓名
分析:
exists()中的语句:在SC表中查找是否有符合条件的元组,找到之后返回一个true,然后让外层的代码输出学生的姓名,找不到时继续查找,直到遍历完整个表,退出该程序。
因为一个学生不仅仅选了一门课,怎么样才可以做到条理清晰呢?
你可以这样考虑——先选择一个学生,看这个学生选了什么课,再看这个学生选的课里面有没有1号课程,有就输出他的姓名,没有就换下一个学生继续同样的操作,直到看完所有学生的情况。(类似于双重嵌套循环)所以才会有SC.Sno=STUDENT.Sno语句,目的就是告诉exists()中的语句你查找的是哪一个学生。
NOT EXISTS:
NOT EXISTS在逻辑语义上相当于不存在......。使用的步骤和EXISTS差不多,但是因为多了一个NOT,所以当not exists()中的语句是假(false)的时候才会执行外面的程序。
例如:查询没有选修1号课程的学生姓名
分析:
思路和过程和上面的分析类似,这里就不赘述了
使用延伸:
通过离散数学中逻辑分析,我们知道可以利用存在量词表达出“全部”、“所有”、“都”等等全称量词的意义。生活中我们也有这样的例子:“我全都要”—“我没有不要的”(不存在我不要的东西)等等。那么我们来看看通过程序怎么实现这个过程的:
实际举例1:查询选了所有课程学生的姓名
分析:
首先,你可以将利用“不存在”(not exist)表达全称量词意思的过程近似理解为“双重否定”。
(可以记为:双重否定变肯定)
然后,我们来分析题目——查询选了所有课程的学生名字
我们最终要的是学生,所以首先写STUDENT表①
我们查询的条件是是否选择了全部课程,所以我们要用COURSE表,因此第二步写COURSE表②
我们最后到哪里查呢?SC表里面有学生的选课信息,所以我们最后一步写SC表③
(可以记为:要什么?用什么?到哪里?)
最后的where语句怎么写呢?
因为我们使用的这三个表之间是有联系的,关键是联系的如何建立,你可以这样想“(到哪里?)SC表和(要什么?)STUDENT表之间联系,(到哪里?)SC表和(用什么?)COURSE表之间联系!”
(可以记为:最后一个表相当于一座桥,左边连第一个表,右边连第二个表)
那么接下来我们开始写语句:
③①之间:SC表和STUDENT表,选择彼此都有的项,因此写——SC.Sno=STUDENT.Sno
③②之间:SC表和COURSE表,因为比的是课程,所以选择课程号Cno,因此写——SC.Cno=COURSE.Cno.
实际举例2:查询至少选修了学生201215122选修的全部课程的学生姓名
分析:
首先,你可以将利用“不存在”(not exist)表达全称量词意思的过程近似理解为“双重否定”。
(可以记为:双重否定变肯定)
然后,我们来分析题目——查询查询至少选修了学生201215122选修的全部课程的学生姓名
我们最终要的是学生,所以首先写STUDENT表①
我们查询的条件是是否选择了学生201215122选修的全部课程,所以我们要用SC表的一部分(x.Sno='201215122'就是为了选出这部分),因此第二步写SC表②
我们最后到哪里查呢?SC表里面有学生的选课信息,所以我们最后一步写SC表③
(可以记为:要什么?用什么?到哪里?)
因为SC表用到了两次,为了加以区分,我们将第一次出现的SC表起别名为—x,第二次出现的SC表起别名为—y。
最后的where语句怎么写呢?
因为我们使用的这三个表之间是有联系的,关键是联系的如何建立,你可以这样想“(到哪里?)SC表和(要什么?)STUDENT表之间联系,(到哪里?)SC表和(用什么?)COURSE表之间联系!”
(可以记为:最后一个表相当于一座桥,左边连第一个表,右边连第二个表)
那么接下来我们开始写语句:
③①之间:SC(y)表和STUDENT表,选择彼此都有的项,因此写——y.Sno=STUDENT.Sno
③②之间:SC(x)表和SC(y)表,因为比的是课程,所以选择课程号Cno,因此写——y.Cno=x.Cno
小结:
利用三段法:要什么?用什么?到哪里?分析,进而选择要写的表及其顺序
再将最后一个表和前面两个表进行分析,进而写出相应的语句
(刚理解起来有点麻烦,但是多想几遍之后,想通思路之后就可以很快的写出来!)
以上程序所用表的具体情况:
文案|特洛乌德科波菲尔
编辑|特洛乌德科波菲尔
图片来源|原创
往期精彩回顾
以上是关于第7期:数据库~查询中的EXISTS操作的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 12.2 公开课及视频及PGCE认证(第10期)(CUUG)(2020年)
PostgreSQL 12.2 公开课及视频及PGCE认证(第7期)(CUUG)(2020年)