当前位置: 首页 > news >正文

exists和in的区别及适用场景

概述

in->几百条数据进行匹配的时候更适合

exists->适用于大量的数据进行匹配

in

-- 示例:查询存在于ta_timp_dgdxt_detail中的账号对应的套餐
SELECT * FROM ta_timp_package 
WHERE actno IN (SELECT account_no FROM ta_timp_dgdxt_detail);

exists

-- 示例:同上,但用EXISTS实现
SELECT * FROM ta_timp_package p
WHERE EXISTS (SELECT 1 FROM ta_timp_dgdxt_detail d WHERE d.account_no = p.actno  -- 主查询与子查询关联
);

详解

一、核心区别与适用场景

1. IN 子查询
  • 逻辑:判断主查询的字段是否在子查询返回的结果集中(WHERE 字段 IN (子查询))。

  • 特点

    • 子查询会先执行并返回所有结果,形成一个临时集合,主查询再逐条匹配这个集合。
    • 若子查询返回 NULL,可能导致结果不符合预期(INNULL 的处理特殊:NULL IN (NULL) 结果为 UNKNOWN,而非 TRUE)。
  • 适用场景

    • 子查询结果集较小(如几百条以内),且字段无 NULL
    • 子查询是固定值列表(如 WHERE id IN (1,2,3))。
  • -- 示例:查询存在于ta_timp_dgdxt_detail中的账号对应的套餐
    SELECT * FROM ta_timp_package 
    WHERE actno IN (SELECT account_no FROM ta_timp_dgdxt_detail);
    
2. EXISTS 子查询
  • 逻辑:判断子查询是否返回至少一条记录(WHERE EXISTS (子查询)),子查询中通常包含与主查询的关联条件。

  • 特点

    • 子查询是 “存在性判断”,一旦找到匹配的记录就会停止搜索(类似 “短路逻辑”),不需要遍历所有结果。
    • NULL 不敏感,即使子查询返回 NULL,只要存在记录就返回 TRUE
  • 适用场景

    • 子查询结果集较大(如几万条以上),尤其是子查询涉及大表时。
    • 子查询需要与主查询通过关联字段(如 actno = account_no)匹配。
  • -- 示例:同上,但用EXISTS实现
    SELECT * FROM ta_timp_package p
    WHERE EXISTS (SELECT 1 FROM ta_timp_dgdxt_detail d WHERE d.account_no = p.actno  -- 主查询与子查询关联
    );
    

二、性能对比

场景IN 性能EXISTS 性能
子查询结果集小优秀(临时集合匹配快)良好(但可能多轮判断)
子查询结果集大较差(临时集合占用内存)优秀(短路逻辑减少计算)
子查询含 NULL可能出错(需额外处理)无影响(仅判断存在性)
主查询表小、子查询大较差优秀
主查询表大、子查询小良好良好(差异不大)

三、总结:如何选择?

  1. 优先用 EXISTS 的情况
    • 子查询结果集大,或子查询涉及大表。
    • 需要通过关联字段(如 p.actno = d.account_no)与主查询关联。
    • 子查询可能包含 NULL 值。
  2. 优先用 IN 的情况
    • 子查询结果集小(如固定值列表或小表查询)。
    • 子查询无需与主查询关联(如独立的固定条件)。
  3. 特殊说明
    • 现代数据库(如 PostgreSQL 12+、MySQL 8.0+)的优化器会自动转换 INEXISTS 为高效执行计划,部分场景下两者性能差异很小。
    • 实际开发中,建议通过 EXPLAIN 分析执行计划,再决定使用哪种方式。

文章转载自:

http://D6Jvy26Y.mLnbd.cn
http://tGpZ2W0A.mLnbd.cn
http://4XyUMpUA.mLnbd.cn
http://kCMrv8Cr.mLnbd.cn
http://0YOkwLrE.mLnbd.cn
http://znwf3N85.mLnbd.cn
http://yRnLmspY.mLnbd.cn
http://rdzIxUTm.mLnbd.cn
http://blZlsOkG.mLnbd.cn
http://TeVezFye.mLnbd.cn
http://C1oJZMAd.mLnbd.cn
http://JtWcSkPV.mLnbd.cn
http://5dsZOAHG.mLnbd.cn
http://pPKto8Zb.mLnbd.cn
http://FMepz6SI.mLnbd.cn
http://jNCNG3U7.mLnbd.cn
http://29Bt4pkt.mLnbd.cn
http://385VPwfL.mLnbd.cn
http://rxh9Gqd3.mLnbd.cn
http://xTBoqM4F.mLnbd.cn
http://fHqMcdXM.mLnbd.cn
http://kfvyW0Tf.mLnbd.cn
http://ttjoOumU.mLnbd.cn
http://b4xjPwLp.mLnbd.cn
http://NGMv1urz.mLnbd.cn
http://1bx4RPW6.mLnbd.cn
http://dsaXwyMr.mLnbd.cn
http://JYIfTbI8.mLnbd.cn
http://DCD8PnID.mLnbd.cn
http://6s3De1fB.mLnbd.cn
http://www.dtcms.com/a/385067.html

相关文章:

  • 基于单片机的客车综合报警系统(论文+源码)
  • 积极践行“人工智能+”行动,山东大学数字人文教科研一体平台完成 AI 化升级
  • 晨曦中,它已劳作:一台有温度的机器人如何重塑我们的洁净日常
  • 易语言中判断函数中可空参数不为空?
  • 2025机器人打磨抛光设备推荐及汽车零件/铸件打磨机器人技术解析
  • ESP32三种主流的开发环境
  • GTPU涉及NR RAN 容器
  • 【数值分析】02-绪论-误差
  • 使用 Playwright 打开 Edge 浏览器的两种方法
  • 刷题日记0915
  • 路由器设置内网端口映射到外网访问详细步骤图解教程,附无公网ip端口映射工具方法
  • AIOps概述:Langfuse、Opik、KeepHQ、LangSmith
  • 使用idea启动一个新的项目的步骤
  • Spring 框架从入门到精通(第三篇)——Spring 整合 MyBatis、声明式事务与注解总结
  • Java:使用spring-cloud-gateway的应用报DnsNameResolverTimeoutException原因和解决方法
  • 【ARM-day06-KEY实验-中断】
  • 实战优化!多智能体React模式:层级指挥的黄金法则​
  • 容器逃逸漏洞
  • 石头科技出海升级:全球电商业财一体化与OMS实践
  • (二)文件管理-文件权限-chmod命令的使用
  • 使用 cAdvisor 监控容器
  • MongoDB 删除集合
  • 【C++】C++中内存管理的利器“智能指针”
  • C++——高并发内存池设计(一)
  • 快速入门HarmonyOS应用开发(一)
  • 深入解析 `pthread_detach`:告别线程的优雅之道
  • Arduino 通讯接口全景解析:从硬件到软件的跨板对话艺术
  • Python3练习题
  • AI GEO 实战:借百度文小言优化,让企业名称成搜索热词
  • 数字图像处理(1)OpenCV C++ Opencv Python显示图像和视频