位置: 编程技术 - 正文

SQL查询中in和exists的区别分析

编辑:rootadmin

select * from A where id in (select id from B);

select * from A where exists (select 1 from B where A.id=B.id);

对于以上两种情况,in是在内存里遍历比较,而exists需要查询数据库,所以当B表数据量较大时,exists效率优于in。

1、select * from A where id in (select id from B);

in()只执行一次,它查出B表中的所有id字段并缓存起来。之后,检查A表的id是否与B表中的id相等,如果相等则将A表的记录加入结果集中,直到遍历完A表的所有记录。它的查询过程类似于以下过程:

可以看出,当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次如:A表有条记录,B表有条记录,那么最多有可能遍历*次,效率很差。再如:A表有条记录,B表有条记录,那么最多有可能遍历*次,遍历次数大大减少,效率大大提升。

结论:in()适合B表比A表数据小的情况

2、select * from A where exists (select 1 from B where A.id=B.id);

exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是其内查询语句的结果集空或者非空,空则返回false,非空则返回true。它的查询过程类似于以下过程:

当B表比A表数据大时适合使用exists(),因为它没有那么多遍历操作,只需要再执行一次查询就行。如:A表有条记录,B表有条记录,那么exists()会执行次去判断A表中的id是否与B表中的id相等。如:A表有条记录,B表有条记录,那么exists()还是执行次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果。再如:A表有条记录,B表有条记录,那么exists()还是执行次,还不如使用in()遍历*次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快。

结论:exists()适合B表比A表数据大的情况

当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,可以通过使用 EXISTS 条件句防止插入重复记录。insert into A (name,age) select name,age from B where not exists (select 1 from A where A.id=B.id);

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

关于exists:

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。EXISTS 指定一个子查询,检测行的存在。语法: EXISTS subquery参数: subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型: Boolean 如果子查询包含行,则返回 TRUE ,否则返回 FLASE 。结论:select * from A where exists (select 1 from B where A.id=B.id) EXISTS(包括 NOT EXISTS )子句的返回值是一个boolean值。 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)。

推荐整理分享SQL查询中in和exists的区别分析,希望有所帮助,仅作参考,欢迎阅读内容。

SQL查询中in和exists的区别分析

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

sql条件查询语句的简单实例 //创建成绩表createtableresult(stu_idvarchar2()notnull,chinanumber(9,2)null,mathnumber(9,2)null,englishnumber(9,2)null);//插入数据insertintoresultvalues('',,,);insertintoresultvalu

sql with as用法详解 一.WITHAS的含义WITHAS短语,也叫做子查询部分(subqueryfactoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,

Sql Server中清空所有数据表中的记录 SqlServer中清空所有数据表中的记录清空所有数据表中的记录:execsp_msforeachtable@Command1='truncatetable?'删除所有数据表:execsp_msforeachtable'deleteN''?'''清空SQLServ

标签: SQL查询中in和exists的区别分析

本文链接地址:https://www.jiuchutong.com/biancheng/320325.html 转载请保留说明!

上一篇:sql 百万级数据库优化方案分享(百万级别数据库mysql)

下一篇:sql条件查询语句的简单实例(sql条件查询语句怎么写)

  • 增值税发票服务名称可以更改吗
  • 进项留抵转出会计分录
  • 税后利润和净利润是一样的吗
  • 利息税怎么算的
  • 预收款增值税纳税义务发生时间与确认收入时间
  • 简易征收适用哪条法律
  • 所得税申报更正申报怎么报?
  • 连锁药店总部的首营资料
  • 印花税没有在我的待办里是不是就不用申报
  • 上市公司股票增持是什么回事
  • 关联的公司
  • 买卖汇票是什么意思
  • 虚开费用发票入账
  • 收到联营单位预收的发票
  • 从个人出开进的房租租赁发票可以抵扣几个点?
  • 企业作为股东分红上税吗怎么算
  • 工资不在本公司发票报销可以吗?
  • 网上认证服务费可以全额抵扣吗
  • 无产权车位20年到期后还收费吗
  • 委托出口业务的账务如何处理呢?
  • 报销时可以一个人报销吗
  • 个体户生产经营所得税率表2023
  • 公司注销时债权人未申报债权
  • 交易性金融资产入账价值怎么计算
  • 小规模防伪税控服务费280元
  • 稳增长促转型
  • win7玩什么游戏流畅
  • PHP:xml_parser_create_ns()的用法_XML解析器函数
  • PHP:pg_get_result()的用法_PostgreSQL函数
  • linux bsub
  • neoCopy.exe - neoCopy是什么进程 有什么用
  • 软件企业职工培训费税前扣除标准
  • uniapp的css库
  • 按实际成本结转6日和7日的材料采购成本
  • 发票点击了打印,然后怎么修改
  • 一台电脑能不能接两个键盘
  • 数据挖掘期末考试大纲
  • 定期存款应计入会计哪个科目
  • 网上购物没有发票怎么保修
  • 职工福利费怎么处理
  • 发票认证的目的和意义
  • 报销差旅费用什么发票
  • 开票软件怎么增加开票员
  • python字典的特点和用处
  • 货物搬运费会计科目
  • 业务活动表本年累计数公式是什么
  • 增值税专用发票是干什么用的
  • 个体工商户税收标准2023年
  • sqlalchemy mongodb
  • 小规模纳税人收普票和专票有什么区别
  • 免征增值税的会计处理一般纳税人
  • 进项税额转出和红字冲销区别
  • 有限合伙企业如何报税
  • 金税三期个税卸载流程
  • 销售商品发生的运输费计入什么科目
  • 哪些进项的税可以退税
  • 汇算清缴补税的凭证后面需要附件吗
  • 权益净利率计算公式产权比率
  • 金蝶主要业务及软件产品
  • 年度计提资产减值准备 好还是坏
  • 固定资产标准提高是政策变更吗
  • 公司买车可以抵税几年
  • Vista下WMC不能播放RMVB解决办法
  • win8打开桌面
  • mssqlserver安装
  • Windows Server 2008网上邻居打开慢的解决
  • windows7计算机管理拒绝访问
  • 桌面美化助手
  • 升级win10错误
  • Android自定义控件,切换APP再切回来控件消失了
  • excel嵌入图片变成代码怎么办
  • 面向对象实例化
  • xcopy命令拷贝目录
  • unity2d ui
  • javascript引用值
  • 国家税务总局电子发票
  • 宁波地铁支付宝可以刷吗
  • 浙江省电税务局电话
  • 中行网银查询
  • 投资损失属于所得税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设