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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中的策略模式(策略模式java)

    前言当代码中出现多重if-else语句或者switch语句时。弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处,那么程序就会出错。弊端之二:代码逻辑难以理解。卫语句卫语句的使用,并不能改变前言说的弊端:一旦需求更改,需要修改所有使用更改需求的if-else代码块。不过使用卫语句可以让自己或者代码…

    2022年4月18日
    57
  • Python创建容器和集合之源码分析

    _collections_abc.py文件中提供了许多抽象基类,这些类将集合分解成许多互相独立的属性集__all__=["Awaitable","Coroutin

    2021年12月19日
    41
  • 企业web建站平台—格子平台采用云计算

    企业web建站平台—格子平台采用云计算运用最先进的IT技术——“云计算”,将互联网上各种实用的、有趣的、新奇的元素都浓缩到一个格子里,并且将所有格子都联接在一起,为用户提供出色的价值体验,这就是格子“云”平台。√您只需要注册一个账

    2022年7月3日
    27
  • 数据库系统概论第五版 课后习题答案王珊

    数据库系统概论第五版 课后习题答案王珊第1章绪论1.试述数据、数据库、数据库系统、数据库管理系统的概念。答:(l)数据(Data):描述事物的符号记录称为数据。数据的种类有数字、文字、图形、图像、声音、正文等。数据与其语义是不可分的。解析在现代计算机系统中数据的概念是广义的。早期的计算机系统主要用于科学计算,处理的数据是整数、实数、浮点数等传统数学中的数据。现代计算机能存储和处理的对象十分广泛,表示这些对象的数据…

    2025年11月13日
    4
  • C语言中break和continue的用法「建议收藏」

    C语言中break和continue的用法「建议收藏」switch选择switch(表达式){ case常量表达式1:语句1; case常量表达式1:语句1; default:语句3;}所有case后面的表达式只能是:枚举常量、数值变量、字符常量、常变量#include<stdio.h>intmain(void){ intval; printf(“请输入您想进入的层数:”); sca…

    2022年6月6日
    33
  • Codeblocks断点调试

    Codeblocks断点调试首先,新建一个C/C++的codeblocks项目。具体步骤如下:1.新建一个工程(project),注意路径中不要包含中文,否则后面断点调试时会出现问题2.直接选择空工程3.选择C或者C++项目即可4.点开工作空间(workspace)中的Source文件夹,即可对文件进行编辑然后,在.c或者.cpp文件中编写程序,设置断点进行调试。下面以一个小程序为例:

    2022年5月11日
    42

发表回复

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

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