第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号课程的学生姓名

第7期:数据库~查询中的EXISTS操作

分析:

  • 思路和过程和上面的分析类似,这里就不赘述了





使用延伸:

      通过离散数学中逻辑分析,我们知道可以利用存在量词表达出“全部”、“所有”、“都”等等全称量词的意义。生活中我们也有这样的例子:“我全都要”“我没有不要的”(不存在我不要的东西)等等。那么我们来看看通过程序怎么实现这个过程的:

实际举例1:查询选了所有课程学生的姓名

第7期:数据库~查询中的EXISTS操作

分析:

  • 首先,你可以将利用“不存在”(not exist)表达全称量词意思的过程近似理解为“双重否定”

(可以记为:双重否定变肯定)


  • 然后,我们来分析题目——查询选了所有课程的学生名字

  1. 我们最终要的是学生,所以首先写STUDENT表

  2. 我们查询的条件是是否选择了全部课程,所以我们要用COURSE表,因此第二步写COURSE表

  3. 我们最后到哪里查呢?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选修的全部课程的学生姓名

  1. 我们最终要的是学生,所以首先写STUDENT表

  2. 我们查询的条件是是否选择了学生201215122选修的全部课程,所以我们要用SC表的一部分(x.Sno='201215122'就是为了选出这部分),因此第二步写SC表

  3. 我们最后到哪里查呢?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操作的主要内容,如果未能解决你的问题,请参考以下文章

第13期:最全91道MySQL面试题 | 附答案解析

PostgreSQL 12.2 公开课及视频及PGCE认证(第10期)(CUUG)(2020年)

第183期1小时学会MySQL读写分离

PostgreSQL 12.2 公开课及视频及PGCE认证(第7期)(CUUG)(2020年)

PostgreSQL 12.2 公开课及视频及PGCE认证(第7期)(CUUG)(2020年)

MySQL EXISTS 怎么用呢?