SQL中EXISTS的用法

GPU服务器维修全流程:从检测到解锁 《GPU服务器维修维保全流程指南》摘要:本文系统介绍GPU服务器从检测到解锁的完整维修流程。检测环节包含物理检查(氧化层、散热、PCB板)和电子诊断(ECC报错率、电源波动等);核心维修技术涵盖PCB板修复(微孔镀铜、BGA返修)和芯片级维修(成功率78-92%);解锁验证阶段包括性能解锁(VBIOS重写)和72小时稳定性测试。文末提供故障速查表及维保建议,强调定期除尘可降低38%故障率,推荐环境粉尘浓度控制在≤0.3mg/m³。 阅读详情

一、引言

select a.pid,a.pname FROM person a
where exists(
select b.oid FROM Orders b where b.oid = a.pid) 

此时 EXISTS 是如何执行的呢?子查询返回的是 oid 字段,而外面的查询要找的是 pid 和 pame 字段,这两个字段肯定不在 oid 里面啊,这是如何匹配的呢?

EXISTS 用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值 true/false。EXISTS 指定一个子查询,检测行的存在。

语法: EXISTS subquery
参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。
结果类型:boolean。如果子查询包含行,则返回 true,否则返回 false。

二、使用

1.在子查询中使用 NULL 仍然返回结果集

select * from tab where exists(select null)
等同于:select * from TableIn

2.比较使用 EXISTS 和 IN 的查询。注意两个查询返回相同的结果。

select * from tab 
where exists(select exid from tabex where bname=tab.aname)
select * from tab where aname in(select bname from tabex)

3.比较使用 EXISTS 和 = ANY 的查询。注意两个查询返回相同的结果。

select * from tab
where exists(select exid from tabex where bname = tab.ANAME)
select * from tab
where aname = any(select bname from tabex)

NOT EXISTS 的作用与 EXISTS 正好相反。如果子查询没有返回行,则满足了 NOT EXISTS 中的 WHERE 子句。

三、结论

EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

分析器会先看语句的第一个词,当它发现第一个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字找到表名并把表装入内存。接着是找WHERE关键字,如果找不到则返回到SELECT找字段解析,如果找到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成一张我们要的虚表。
WHERE关键字后面的是条件表达式。条件表达式计算完成后,会有一个返回值,即非0或0,非0即为真(true),0即为假(false)。同理WHERE后面的条件也有一个返回值,真或假,来确定接下来执不执行SELECT。
分析器先找到关键字SELECT,然后跳到FROM关键字将STUDENT表导入内存,并通过指针找到第一条记录,接着找到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到一个虚表当中,指针再指向下一条记录。如果为假那么指针直接指向下一条记录,而不进行其它操作。一直检索完整个表,并把检索出来的虚拟表返回给用户。EXISTS是条件表达式的一部分,它也有一个返回值(true或false)。

在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。
INSERT INTO TableIn (ANAME,ASEX)
SELECT top 1 ‘张三’, ‘男’ FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)

EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。

四、in、not in、exists和not exists的区别

exists

存在,后面一般都是子查询,当子查询返回行数时,exists 返回true。当 in 和 exists 在查询效率上比较时,in 查询的效率快于 exists 的查询效率exists(xxxxx) 后面的子查询被称做相关子查询,其不返回列表的值的,只是返回一个 true 或 false 的结果。也就是它只在乎括号里的数据能不能查找出来,是否存在这样的记录。
其运行方式是先运行主查询一次,再去子查询里查询与其对应的结果,如果存在,返回 true 则输出,反之返回 false 则不输出,再根据主查询中的每一行去子查询里去查询。执行顺序如下:

  1. 首先执行一次外部查询。
  2. 对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。
  3. 使用子查询的结果来确定外部查询的结果集。如果外部查询返回 100 行,SQL 就将执行 101 次查询。一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。

in

后面的子查询是返回结果集的,换句话说执行次序和 exists() 不一样。子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去。符合要求的输出,反之则不输出。

not in 和 not exists 的区别

not in 只有当子查询中,select 关键字后的字段有 not null 约束或者有这种暗示时用 not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用 not in。

not in 的执行顺序是:是在表中一条记录一条记录的查询(查询每条记录)符合要求的就返回结果集,不符合的就继续查询下一条记录,直到把表中的记录查询完。也就是说为了证明找不到,所以只能查询全部记录才能证明。并没有用到索引。

not exists:如果主查询表中记录少,子查询表中记录多,并有索引。

not exists 的执行顺序是:在表中查询,是根据索引查询的,如果存在就返回 true,如果不存在就返回 false,不会每条记录都去查询。
之所以要多用 not exists,而不用 not in,也就是 not exists 查询的效率远远高于 not in 查询的效率。

2023全国职业技能大赛 网络系统管理 服务部署 Linux部分--基础配置 服务器和客户端基本配置如下表,各虚拟机已预装系统。一、关闭防火墙和Selinux。七、需要使用到的命令详解。三、修改root密码。 阅读详情

相关推荐

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 471

sql server EXISTS与not exists 使用

EXISTS 使用EXISTS(或NOT EXISTS)关键字引入一个子查询时,子查询实际上不产生任何数据;它只返回TRUE或FALS值。 指定一个子查询,检测行的存在。 如果子查询包含行,则返回 TRUE IN效率要差(返回子查询)

lilalsy的博客 7412

DASH 流媒体协议(Dynamic Adaptive Streaming over HTTP)概述——起源、MPD文件解析、相关项目

简单介绍DASH的起源与发展、MPD文件简要解析、相关项目,以及常见流媒体协议的比较

farewellyi的博客 6879

sqlserver not exists用法

选择存在于tA表中,但其中name不同于tB表中的数据 select id, name, gender, classId from tA  where  not  exists (select name from tB  where tA.name=tB.name) not in 的写法,同样的效果,但是在大数据量的时候效率不高 select id, name, gender,

code旅行者的专栏 1万+

自回归分布滞后模型 (ARDL)及 Stata 具体操作步骤

例如,Bahmani-Oskooee 和 Brooks(1999)研究了汇率波动与贸易收支之间的关系,发现汇率的变动在长期和短期内对贸易收支的影响存在差异,ARDL 模型能够有效地捕捉这种复杂的关系。它结合了自回归(Autoregressive,AR)模型和分布滞后(Distributed Lag,DL)模型的特点,能够同时考察变量之间的短期和长期关系。假设我们收集了一段时间内的居民消费和可支配收入数据,通过对这些数据进行分析和估计,可以得到模型的参数估计值,从而揭示消费与收入之间的短期和长期关系。

a519573917的博客 6092

T113-S3-RTL8211网口phy芯片调试

在嵌入式系统开发中,网络连接是至关重要的一部分。T113-S3开发板搭载了RTL8211系列的网口PHY芯片,用于实现以太网连接。在开发过程中,对于网口的稳定性和性能的调试至关重要。本篇博客将介绍如何调试T113-S3开发板中的RTL8211网口PHY芯片,以确保网络连接的正常工作。

flypig has a dream! 4614

sql 判断是否有记录(exists)

说明 EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。 EXISTS 可以与 NOT 一同使用。 示例 判断系统中是否存在sal_order_test表 if exists(select * from sal_order_test) begin print '存在' end else print '不存在' 输出: 存在 完成时间: 2022-02-22T16:13:01.6429757+08:00 ...

weixin_51803498的博客 5057

24届数字IC验证——SV+UVM基础知识汇总(一)

汇总整理在面试过程中常见的问题,如果都能回答下来,那么面试肯定不成问题的分别构建不同抽象级的transaction,来实现复杂的激励。(以前是单一层次的sequence,对激励复用、上层复用不塌友好)不同层级之间的sequence没有继承关系,相互之间进行转换低层次的sequence从高层次的sequencer中获取高层次的sequence,并将其转换为低层次的sequence,再通过低层次的sequencer发送出去如何连接:低层次的sequencer包含高层次sequencer的句柄。

qq_42135020的博客 3144

SQL判断查询结果是否存在EXISTS

IF NOT EXISTS (SELECT 0 FROM [train_enroll_data] WHERE [courseId] = 636235546473141211)         BEGIN             SELECT CAST(1 AS BIT)         END ELSE         BEGIN             SELECT CAST(0 AS BIT)...

gdali的专栏 9658

VMware Horizon 8 2111 部署系列(十一)准备RDS主机

RDS (Remote Desktop Service),即远程桌面服务。我们可以使用 Microsoft 远程桌面服务 (RDS) 提供 RDS 主机上的桌面会话并将应用程序传送给多个用户。

白昼的技术专栏 3467

【agent实操】OpenClaw玩转股票分析多个AI智能体(agent)出谋划策

本文介绍了一个基于OpenClaw的多Agent股票分析系统。该系统采用"三人组+总调度"模式,包含三个核心Agent:小牛马(策略中枢)、牛老二(基本面分析师)和牛老三(技术面分析师)。相比单Agent模式,该系统具有分析更专业、权限分级更安全、成本控制更优等优势。文章详细说明了系统部署的6个步骤,包括创建独立Agent工作区、配置专属人设与技能等,并提供了环境检查命令和验证方法。通过这种多Agent协作的方式,可以实现更专业、更安全的股票分析。

海兰 806

sql中exists用法

exists关键字介绍 exists强调的是 是否返回结果集,不要求知道返回什么,比如: SELECT * FROM AM_USER WHERE EXISTS (SELECT 1 FROM AM_ROLE WHERE NAME = 'admin') 只要exists引导的子句有结果集返回,那么exist的条件就成立。SELECT 1 FROM AM_ROLE 返回的数字没有意义,exists子句不在乎返回什么,而是在乎有没有结果返回。 而exists与in最大的区别在于in引导的子句只能返回一个字段,比如

安夜的cookie 2万+

C# Winform使用Monaco打造代码编辑器

本文介绍了如何在Winform项目中集成Monaco代码编辑器。通过NuGet安装WebView2控件,创建monaco-editor.html文件加载编辑器,并实现与C#代码的交互。关键步骤包括:初始化WebView2环境、配置Monaco编辑器参数、设置代码变更监听事件以及处理C#与JavaScript之间的通信。注意事项提示了依赖库安装问题的解决方法。该方案实现了功能完整的代码编辑器,支持代码自动保存和实时显示功能。

遇见--专栏 346

SQL语句中EXISTS的用法

记录:258 在业务开展中,会遇到类似需求。 需求1:UPDATE表TEST_TB01中的记录;满足条件:这些记录不在TEST_TB02中。 需求2:UPDATE表TEST_TB01中的记录;满足条件:这些记录在TEST_TB02中。 在SQL语句中EXISTS的用法,能够比较简洁的去解决这类需求。 一、建表 1.在MySQL数据库建表语句 CREATE TABLE TEST_TB01 ( sensor_id BIGINT, part_id BIGINT, f

zhangbeizhen18的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SQL中Exists用法

SQL中Exists用法

秉持Love and share的态度去学习和生活 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SQL 语句中 exists和not exists的用法

exists           (返回结果集,为真)    not exists       (不返回结果集,为真)  表A  ID   NAME    1       A1  2       A2  3       A3  表B  ID   AID   NAME  1       1       B1  2       2       B2    3       2       B3  ...

wxf_suzhou的博客 16万+

SQL-exists的用法

关于exists的用法,相信很多人都有点迷糊。一开始,我也犯迷糊,看了多篇博客和进行多次实验之后,其实,理解exists的用法并没有那么困难。测试表之前已经建立过,可以查阅这篇博客看看测试表具体数据。 1. 用法 select * from table_name where [not] exists(子查询); 2. 分析过程 1、首先查询select * from table_name的结果 2...

熊博主 1万+

【Mysql】sql中exists,not exists的用法

exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(select 1 from grade where ...),只要 exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成select 2 from grade...

Hurpe 9508

SQL 查询中exists用法

EXISTS 的子查询 不返回具体的数据,只返回所查询数据的行数。所以一般EXISTS后面的查询通常都用 * 表示,给出具体的列名没有实际意义 若内层的查询结果为非空,则外层的 WHERE语句 子句返回真值,否则返回假值 【例1】 查询所有选修1号课程的学生姓名 SELECT sname FROM Student WHERE EXISTS (SELECT * FROM SC...

hieya的博客 6991
上一篇: Oracle 生成多位不重复的纯数字序列(Sequence)
下一篇: Oracle 同义词(Synonym)
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值