SQL NOT EXISTS讲解 (详例助理解)

2023-11-15

首先我们要知道对于exists和not exists 的返回值都是真假。
exists :如果子查询查询到了列那么就为假
not exists : 如果子查询查询不到结果则返回值为真

下面来举例子来理解not exists:

先给出三个表:
student:

sno(学号)
s1
s2

course:

cno(课程号)
c1
c2

sc(选课系统):

sno(学号) cno(课程号)
s1 c1
s1 c2
s2 c1

现在我们希望能够查询到选修了所有课程的学生学号:

--SQL查询
SELECT sno --xz1
FROM student s
WHERE NOT EXISTS(SELECT *  --bcz1   xz2
                 FROM course c
                 WHERE NOT EXISTS(SELECT * --bcz2  xz3
                                FROM sc
                                WHERE sc.sno=s.sno AND sc.cno=c.cno));

下面来解释一下查询过程:
我们先按顺序记录一下选择 xz1,xz2,xz3
不存在 bcz1,bcz2.(拼音首字母)

 我们可以将其选择过程看作是一个循环嵌套(第一层为student,第二层为course ,第三层为sc)
{	
	对于xz1 我们查询的对象是student 
	{
		其下有两个成员 s1,s2
		{//现在查询s1
			对应的bcz1的子查询的对象是course
			{
				其下有俩成员c1,c2
				{//现在查询s1-c1
					对于bcz2的子查询的对象是sc
					{
						其下有三个成员: s1-c1  s1-c2  s2-c1
						{
							里面有s1-c1 所以xz3可以查询到一条结果
							bcz2能接收到一条结果所以此时为假
							xz2因为bcz2为假此时查询不到结果
							此时bcz1也还没有接收到结果所以为真
						}
					}	
				}
*****************************
				{//现在查询s1-c2
					对于bcz2的子查询的对象是sc
					{
						其下有三个成员: s1-c1  s1-c2  s2-c1
						{
							里面有s1-c2 所以xz3可以查询到一条结果
							bcz2能接收到一条结果所以此时为假
							xz2因为bcz2为假此时查询不到结果
							此时bcz1也还没有接收到结果所以为真
						}
					}
				}
				对于s1的查询完毕:bcz2接收到了两条结果所以两次为假, 因而xz2 一条信息都没有查询到, 因而bcz1 一条结果都没接收到所以bcz1结果为真,xz1此时查询到了s1.
			}
**************************************************************************************************
		{//现在查询s2
			对应的bcz1的子查询的对象是course
			{
				其下有俩成员c1,c2
				{//现在查询s2-c1
					对于bcz2的子查询的对象是sc
					{
						其下有三个成员: s1-c1  s1-c2  s2-c1
						{
							里面有s2-c1 所以xz3可以查询到一条结果
							bcz2能接收到一条结果所以此时为假
							xz2因为bcz2为假此时查询不到结果
							此时bcz1也还没有接收到结果所以为真
						}
					}	
				}
*******************************
				{//现在查询s2-c2
					对于bcz2的子查询的对象是sc
					{
						其下有三个成员: s1-c1  s1-c2  s2-c1
						{
							里面没有s2-c2 所以xz3查询不到结果
							bcz2没有接收到一条结果所以此时为真
							xz2因为bcz2为真此时查询到一条结果
							此时bcz1接收到xz2结果所以为假
						}
					}
				}
				对于s2的查询完毕:bcz2接收到了一条结果所以两次分别为假和真, 因而xz2 可以在bcz2为真时查询道一条信息, 因而bcz1 接收了一条结果所以bcz1结果为假,xz1此时查询不到了s2.
	}
	所以最终结果为 s1
}

也可以从理解上下手:
既然要查询选修了所有课程的学生。那么只要出现了少选一门课程的学生就不是我们要找的对象。
可以用不存在来筛选,只要有一门课他没选,我就不选他。这里就是两个not exists 的含义。

只要我在sc查不到你这个关系,最内层的选择就没有返回值,那么中层的选择就能查到结果,那么最外层的not exists 就为假,最外层的选择就选不到这个学生。

还是多理解理解吧!

若有错误,欢迎指出和评论!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL NOT EXISTS讲解 (详例助理解) 的相关文章

  • SQL Server 2008 R2 的 Try_Convert

    我正在使用 SQL Server 2008 R2 并且有一个VARCHAR我想要转换为的列DECIMAL 28 10 using CONVERT 但其中许多行的格式错误 因此无法将它们解析为数字 在这种情况下 我只想通过将结果设置为 0 或
  • SQL SERVER 中的排序依据和大小写

    我需要在存储过程中按功能排序 一个值被发布到网络服务 并且基于该值我必须以某种方式对结果进行排序 即 当 ColName 按 ColName 发布订单时 当 ColName2 由 ColName2 发布订单时 我正在研究使用 Case 但出
  • ClassCastException:java.util.Date 无法转换为 java.sql.Date

    你好 我的代码抛出了ClassCastException StackTrace 显示 java lang ClassCastException java util Date cannot be cast to java sql Date a
  • 将 UPDATE 转换为 INSERT INTO ON DUPLICATE KEY UPDATE 语句

    我有这个 UPDATE MySQL 语句 效果很好 UPDATE table1 Inner Join table2 ON table2 id table1 gw id SET table1 field1 1 table1 field2 2
  • 使用 WHILE 创建虚拟数据

    我尝试使用 a 在表中插入一些虚拟数据WHILE 但它运行得非常非常慢 我在想也许我写的代码不正确 你能看一下并确认一下吗 Insert dummy data DECLARE i int Content int SET i 5001 WHI
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • postgres 有 CLOSEST 运算符吗?

    我正在寻找这样的东西 给定一个表格 id number 1 7 2 1 25 3 1 01 4 3 0 查询SELECT FROM my table WHEREnumberCLOSEST 1 将返回第 3 行 我只关心数字 现在我有一个程序
  • 插入多行并返回主键时 Sqlalchemy 的奇怪行为

    插入多行并返回主键时 我注意到一些奇怪的事情 如果我在 isert 查询中添加使用参数值 我会得到预期的行为 但是当将值传递给游标时 不会返回任何内容 这可能是一个错误还是我误解了什么 我的sqlachemy版本是0 9 4 下面如何重现错
  • 限制 SQL Server 连接到特定 IP 地址

    我想将 SQL Server 实例的连接限制为特定 IP 地址 我想阻止来自除特定列表之外的任何 IP 地址的任何连接 这是可以在 SQL Server 实例或数据库中配置的东西吗 听起来像是你会使用Windows防火墙 http tech
  • TOAD 将 &String 视为绑定变量

    我正在使用 Oracle Data Integrator 开发一些 ETL 有时会使用 TOAD 测试部分代码 今天我遇到了 TOAD 的问题 我有一行像 AND column value like DEV PROD 当我尝试运行包含上面过
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 根据表sql中的行替换字符串中的字符

    我需要用一些映射的字符替换字符串中的字符列表 我有一个表 dbo CharacterMappings 有 2 列 CharacterToFilter 和 ReplacementCharacter 假设这个表中有3条记录 Filter Rep
  • 复选框上的数据绑定

    我目前正在将数据从 SQL 数据库之一提取到我的应用程序中 我可以让它适用于我的文本框和其他项目 但是 我似乎无法让它适用于复选框 这是我正在使用的代码 DataTable dt new DataTable dt using SqlConn
  • 如何在使用连接池时强制 SqlConnection 物理关闭?

    我明白 如果我实例化一个 SqlConnection 对象 我实际上是从连接池中获取一个连接 当我调用 Open 时 它将打开连接 如果我对该 SqlConnection 对象调用 Close 或 Dispose 方法 它将返回到连接池 但
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和

随机推荐

  • 微信小程序项目:粤语教学平台-粤言粤语

    文章目录 1 项目简介 1 1 创意来源 1 2选题意义 2 总体设计 2 1 系统功能 2 1 1 功能概述 2 1 2 功能说明 2 2 系统软硬件平台 2 3 关键接口技术 2 4 作品特色 3 详细设计 3 1 系统结构设计 3 1
  • error C2666: “QByteRef::operator ==”: 2 个重载有相似的转换

    出现这样的问题 就是语法出现问题 以下写就是错的 以下写的就是解决了问题
  • 树莓派使用上spi tft!(fbtft的使用)

    关于树莓派的视频输出除了HDMI和 VNC基本上没有其他的方法 如果你手上刚好有一块TFT模块的话就可以当做系统显示屏 framebuff 虽然分辨率不高 但足以满足一些cmd的需求 github上项目 notro fbtft 很好的实现了
  • MyBatis使用resultMap解决1对多关联映射

    案例 查询MySQL中user表和orders表所有用户信息及用户关联的订单信息 用户信息和订单信息为一对多关系 SELECT u id u username u birthday u sex u address o id oid o nu
  • httprunner startproject.....报错

    httprunner新版本新建框架报错 问题 一开始报 cmd命令输入 httprunner startproject demo cmd结果显示 usage httprunner h V run make 我尝试降低到V2的版本 后面直接输
  • VMware虚拟机添加新硬盘

    在windows Server 2008 R2虚拟机配置中新加一块硬盘 首先在主机配置界面 打开虚拟主机设置 gt 添加一个新的硬盘组件 gt 选择磁盘接口类型 gt 创建新磁盘 gt 分配磁盘空间 gt 下一步安装 具体操作流程看下图 注
  • ARMV8体系结构简介:AArch64系统级体系结构之编程模型(3)- 异常

    1 前言 本文介绍异常相关内容 包括异常类型 异常进入 异常返回 异常层次结构 异常的路由等 2 RESET ARMV8体系结构支持两种类型的RESET Cold reset Reset PE所有的逻辑 包括集成的debug功能 Warm
  • Netty 全网最详细的教程! 没有之一!

    Netty 入门 文章目录 Netty 入门 入门案例 1 服务器端代码 2 客户端代码 3 运行流程 组件解释 使用组件 EventLoop 创建一个EventLoopServer 创建一个Client 细分 EventLoopGroup
  • Kubernetes Pod 故障归类与排查方法

    1 Pod 概念 Pod是kubernetes集群中最小的部署和管理的基本单元 协同寻址 协同调度 Pod是一个或多个容器的集合 是一个或一组服务 进程 的抽象集合 Pod中可以共享网络和存储 可以简单理解为一个逻辑上的虚拟机 但并不是虚拟
  • vue 锚点双向滚动监听

  • 欧拉角,轴角,四元数与旋转矩阵详解

    入门小菜鸟 希望像做笔记记录自己学的东西 也希望能帮助到同样入门的人 更希望大佬们帮忙纠错啦 侵权立删 目录 一 欧拉角 1 静态定义 2 欧拉角的表示 3 欧拉角表示的优缺点 4 欧拉角的万向节死锁 静态不存在万向锁的问题 二 四元数 1
  • Junit单元测试1

    实验五 Junit单元测试1 1 实验目的 学习使用 JUnit4 X 进行单元测试 应用 JUnit4 X 进行单元测试 为工程项目中的类 设计测试类 并且运用白盒测试和黑盒测试方法为类中的方法设计足够充分的测试用例集 从而保证 每一个类
  • myeclipse找不到Deployment Assembly ,报错

    今天tomcat加载maven项目遇到错误 java lang ClassNotFoundException org springframework web context ContextLoaderListener 在网上查到解决方法 出
  • 雷厉风行——开启人工智能教育普及时代

    自二十一世纪伊始 我国一线城市已全面进入老龄化严重的趋势 国家急需聪明睿智 精力充沛的年轻人作为人才储备 要全方位的培养年轻人 必须从少儿时期开始抓起 人工智能教育可以启发少儿天马行空的想象力 抽丝剥茧的思维方式 艰苦奋斗的实干精神 格物斯
  • 【hello git】初识Git

    目录 一 简述Git 二 Linux 下 Git 的安装 CentOS 2 1 基本命令 2 2 示例 三 Linux 下 Git 的安装 ubuntu 3 1 基本命令 3 2 示例 一 简述Git Git 版本控制器 记录每次的修改以及
  • matlab第三章课后答案,matlab程序设计第三章课后习题答案推荐.doc

    matlab程序设计第三章课后习题答案推荐 窗体顶端 1 p138 第6题 在同一坐标轴中绘制下列两条曲线并标注两曲线交叉点 gt gt t 0 0 01 pi gt gt x1 t gt gt y1 2 x1 0 5 gt gt x2 s
  • 桥接路由器总是掉线_tplink路由器桥接掉线怎么办

    tplink是普联技术有限公司旗下的品牌 成立于1996年 是专门从事网络与通信终端设备研发 制造和行销的业内主流厂商 那么你知道tplink路由器桥接掉线的解决方法吗 下面是学习啦小编整理的一些关于tplink路由器桥接掉线的相关资料 供
  • 命令行参数格式介绍

    命令行参数 sys argv 命令行参数列表 getopt getopt argparse argparse例子 import argparse def cmd args argparse ArgumentParser descriptio
  • vue3弃用/deep/深度穿透

    使用css时 如果需要改变孙级样式需要用到 gt gt gt 穿透 scss中增加了 deep 功能来做样式穿透 vue项目中也可以写作 v deep vue3之后之前的穿透语法虽然暂时可以正常使用 但是在编译时会抛出异常 说明在不久的将来
  • SQL NOT EXISTS讲解 (详例助理解)

    首先我们要知道对于exists和not exists 的返回值都是真假 exists 如果子查询查询到了列那么就为假 not exists 如果子查询查询不到结果则返回值为真 下面来举例子来理解not exists 先给出三个表 stude