SQL EXITS用法

SQL EXITS用法比如在Northwind数据库中有一个查询为SELECTc.CustomerId,CompanyNameFROMCustomerscWHEREEXISTS(SELECTOrderIDFROMOrdersoWHEREo.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是Cu

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定
比如在Northwind数据库中有一个查询为


SELECT c.CustomerId,CompanyName FROM Customers c


WHERE EXISTS(


SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 


这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢? 




EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False


EXISTS 指定一个子查询,检测 行 的存在。




语法: EXISTS subquery


参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。


结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。

例表A:TableIn 例表B:TableEx
SQL EXITS用法 SQL EXITS用法



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


select * from TableIn where exists(select null)


等同于: select * from TableIn


SQL EXITS用法
 


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


select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)


select * from TableIn where ANAME in(select BNAME from TableEx)


SQL EXITS用法


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


select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)


select * from TableIn where ANAME=ANY(select BNAME from TableEx)


SQL EXITS用法


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适合于外表小而内表大的情况。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226809.html原文链接:https://javaforall.net

(0)
上一篇 2025年6月24日 上午8:43
下一篇 2025年6月24日 上午9:15


相关推荐

  • PHP程序开发之使用header定义一个php页面为utf-8编码或GBK编码

    PHP程序开发之使用header定义一个php页面为utf-8编码或GBK编码php页面为utf-8编码 header(“Content-type:text/html;charset=utf-8”); php页面为gbk编码 header(“Content-type:text/html;charset=gb2312”); php页面为big5编码 header(“Content-type:text/html;charset=b

    2022年7月11日
    32
  • linux运维面试题总结「建议收藏」

    linux运维面试题总结「建议收藏」一、问答题1、安装linux系统对硬盘分区时,必须有那两种分区类型?2、简述raid0、raid1、raid5三种工作原理及特点3、linux下如何改ip,主机名,dns?4、一个ext3的文件分区,当使用touchtest.file命令创建一个新文件时报错,报错的信息是显示磁盘已满,但是采用df-h命令查看磁盘大小时,只使用了60%的磁盘空间,为什么会出现这个情况,说说你的理由5、…

    2022年5月4日
    51
  • AI绘画-即梦ai艺术字生成

    AI绘画-即梦ai艺术字生成

    2026年3月12日
    6
  • 链表快慢指针

    链表快慢指针链表快慢指针 structListNo endOfFirstHa structListNo head structListNo fast head structListNo slow head while fast gt next NULL amp amp fast gt next gt next NULL fast fast gt next gt next

    2026年3月17日
    2
  • java 数组的创建 与 赋值

    java 数组的创建 与 赋值1 2 2 数组类型 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 基本类型的数组有 3 种赋值形式 如下所示 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 第 1 种和第 2 种都是预先知道数组的内容 而第 3 种是先分配长度 然后再给每个元素赋值 第 3 种形式中 即使没有给每个元素赋值 每个元素也都有一个默认值 这个默认值跟数组类型有关 数值类型的值为 0 boolean 为 false char 为空字符 nbsp nbsp nbsp

    2026年3月16日
    2
  • http请求415,报错Unsupported Media Type

    http请求415,报错Unsupported Media Type背景:做一个项目的接口对接,用Getman\postman等接口调试工具都是可以的。用程序运行就报415.原因:根据接口所传参数的不同,post请求的Content-type有四种:application/x-www-form-urlencoded(默认)application/xmlapplication/jsonmultipart/form-data我所对接的接口所传的…

    2022年5月1日
    107

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号