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

article/2025/9/2 9:14:25

数据库系统概论之嵌套查询中的带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上做了笔记和一些标记,不方便分享,你们可以自己从网上下载。

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

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

在这里插入图片描述


http://chatgpt.dhexx.cn/article/1GjnPa5C.shtml

相关文章

sql in和exist

前言 最近写SQL的时候要求在排除A表中所存在的B表的某些同属性值的记录。 然后就想到了in和exist,但是其实一直都没有真正的去弄懂两者不同, 于是在网上查询了一些大佬的文章,然后去实践了一番,最后做一个总结 开始啰 1&#xff…

SQL之EXISTS的理解

将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。 先上表 过程:外查询Persons表,提取出数据到E…

sql中exists的常用用法

exists中子查询结果集非空,则exists子查询返回true。如果exists子查询结果集为空,则exists子查询返回false。在平常的开发工作中,经常会用到exists,那么它应该如何使用呢? 1:查询兴趣爱好为跳舞的同学姓名及…

MySQL SQL语句EXISTS

MySQL中EXITS语句用于查明表中是否存在特定的行。普遍情况下EXITS与子查询一起使用,并返回与子查询返回的结果相等或匹配的行。如果行在表中存在,则返回true,否则返回false。在MySQL中使用EXISTS是低效的,因为EXISTS对查理表中的每…

SQL语句中EXISTS的用法

SQL萌新一个,在这里记录一下自学过程中遇到的问题。 exists:强调的是,是否有返回集,不需要知道具体返回的是什么 比如这两个表: 输入查询语句: select * from customer c where not exists( select * from…

sql中 exists的用法

现有:班级表(A_CLASS) 学生表( STUDENT) 注:学生表(STUDENT)的classId关联班级表(A_CLASS)的主键ID 代码: select * from STUDENT s WHERE exists (select 1 from A_ClASS c where s.CLASS_…

SQL语句中EXISTS的详细用法大全

SQL语句中EXISTS的详细用法大全 前言一、建表1.在MySQL数据库建表语句2.在ORACLE数据库建表语句 二、在SELECT语句中使用EXISTS1.在SQL中使用EXISTS2.在SQL中使用NOT EXISTS3.在SQL中使用多个NOT EXISTS4.在SQL中使用多个EXISTS5.在SQL中使用NOT EXISTS和EXISTS 三、在DELETE语…

DNS服务器解析问题

DNS服务器解析问题 前言 重点: 本文摘选链接:https://www.ancii.com/aazeaa674/ 正文 问题 域名状态异常会导致网站不能访问吗? 刚修改过域名解析,为什么不生效呢? 如何查看解析是否生效呢? 刚在注…

dns服务器怎么设置

dns服务器怎么设置 在修改DNS之前需要先知道你的大DNS服务器地址是什么,那么怎么来查询DNS服务器地址呢?直接按住键盘上的“winR”,调出运行框。在输入框中输入“cmd”,点击“确定”或者回车。在管理员界面中输入命令:…

手机显示DNS服务器异常,手机dns服务器异常怎么设置

手机dns服务器异常怎么设置 内容精选 换一换 华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。 本章节介绍如何通过控制台重启服务器。重启服务器时,可以批量更换云手机…

小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置

小米路由器与日常所有的路由器一样,在默认情况下都是路由器的地址作为无线设备获取的 DNS 地址。如果你想手动修改小米路由器的DNS地址,也是可以的,下面是学习啦小编给大家整理的一些有关小米路由器dns地址设置方法,希望对大家有帮…

如何设置正确的dns服务器地址,dns服务器地址如何设置

dns服务器地址如何设置 (Windows 2000、Windows XP操作系统): 1、 开机后在桌面上选定图标"网上邻居", 点击鼠标右键, 在弹出的菜单上选择"属性"项,打开"网络和拔号连接"窗口, 如图 2、…

北京联通dns服务器位置,联通DNS服务器地址怎么设置

联通DNS服务器地址怎么设置 如电脑Win7系统,以下方法设置DNS:您右键点击电脑桌“网络”图标 ,“属性” >选择“控制面板” >在“网络和共享中心”中可看到当前的网络状况,点击左边的“更改适配器设置” >右键单击“本地连接”择“属性” >选择“internet协议版本4(TCP/…

路由器显示DNS服务器设置错误,路由器dns设置错误怎么处理

一般都给家里配上了无线路由器,但是在用了无线路由器后,很容易导致电脑断网,大家一般用软件检测后上面会显示是DNS地址出现了异常,那么应该怎么解决这个问题,不让电脑频繁断网呢?下面是学习啦小编给大家整理的一些有关…

无线路由dns服务器地址,tplink无线路由器怎么设置DNS服务器地址

作为不同网络之间互相连接的枢纽,路由器系统构成了基于TCP/IP 的国际互联网络Internet 的主体脉络,也可以说,路由器构成了Internet的骨架。在设置路由器的时候,很多用户不知道该怎么手动设置路由器的DNS服务器地址,下面我们就来看看详细的设置教程,需要的朋友可以参考下 …

Ros系统配置DNS服务器,ros设置dns服务器

ros设置dns服务器 内容精选 换一换 域名的DNS服务器定义了域名用于解析的权威DNS服务器。通过华为云注册成功的域名默认使用华为云DNS进行解析,详细内容,请参见华为云DNS对用户提供域名服务的DNS是什么?。若您选择非华为云DNS进行域名解析,可以修改域名的DNS服务器。域名注…

无线网首选dns服务器怎么设置,dns服务器设置(192.168.1.1的首选dns)

我们知道影响上网速度的因素有很多,硬件、软件等都是高速上网的基础,每个人都希望自家的网速越来快,在相同的硬件、带宽固定的情况下,如何来择优选择上网参数中的DNS服务器呢? DNS服务是网络参数必不少的一项&#xff…

dhcp服务器修改dns设置方法,dhcp服务器的dns设置方法

dhcp服务器的dns设置方法 内容精选 换一换 文件系统与服务器的连接断开,需要重新挂载。没有配置自动挂载,重启服务器后会自动断开。参考自动挂载文件系统,在云服务器设置重启时进行自动挂载。如果上述方法均不能解决您的疑问,请提交工单寻求更多帮助。 “包年/包月”计费模…

电脑系统里如何设置dns服务器

在大多数的时候,我们的电脑都是使用的静态ip,给电脑开机就默认获取了ip地址,但有些时候我们要访问一个网页时需要使用固定的ip地址和dns服务器该怎么办呢?下面就和大家分享一下电脑系统里如何设置dns服务器吧。 这些重装系统的方…

dns简单说明及配置

dns IP地址与dns的关系 dns协议是用来将域名转换为IP地址的协议 IP地址是面向主机的 域名是面向用户的 域名和IP的对应关系保存在hosts文件中 dns系统 1、一个系统管理,维护系统内每个主机IP和主机名的对应关系 2、如果新计算机接入网络,要将这个…