IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

/*
IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率
*/

 

IF OBJECT_ID('A') IS NOT NULL
  DROP TABLE A
GO

CREATE TABLE A
(
ID INT
)
GO

IF OBJECT_ID('B') IS NOT NULL
  DROP TABLE B
GO

CREATE TABLE B
(
ID INT
)
GO

DECLARE @ID INT,@IDD INT
SET @ID=1
SET @IDD=2
WHILE @ID<1000000
BEGIN
INSERT INTO A VALUES (@ID)

INSERT INTO B VALUES (@IDD)

SET @ID=@ID+1
SET @IDD=@IDD+2
END

GO


--总结:表A中的数据在表B中存在的效率比较 INNER JOIN = EXISTS = IN
SELECT *
FROM A
WHERE ID IN (SELECT ID FROM B)--4秒
GO

SELECT *
FROM A
WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.ID)--4秒
GO

SELECT A.ID,B.ID
FROM A
INNER JOIN B
ON A.ID=B.ID--4秒

GO


--总结:表A中的数据在表B中不存在的效率比较 LEFT JOIN > NOT EXISTS > NOT IN
SELECT *
FROM A
WHERE ID NOT IN (SELECT ID FROM B)--45秒

GO


SELECT *
FROM A
WHERE NOT EXISTS (SELECT * FROM B WHERE A.ID=B.ID)--4秒

GO

 

SELECT A.ID,B.ID
FROM A
LEFT JOIN B
ON A.ID=B.ID
WHERE B.ID IS NULL--3秒

GO

深入理解 SQL 中的 INNOT IN 关联操作(JOIN):语义、陷阱性能优化指南 SQL查询中的INNOTINJOIN操作对比优化指南 摘要: 本文系统分析了SQL中IN/NOTINJOIN操作的异同,重点揭示了NOTIN在处理NULL值时的致命缺陷。文章指出,IN适用于存在性判断,JOIN适合关联数据获取,而NOTINNULL值会导致意外空结果集,推荐使用NOT EXISTSLEFT JOIN...ISNULL替代。通过电商、半导体制造等实际场景,展示了同操作的选择策略,并提供了性能优化建议,包括索引设计、执行计划监控等。最后给出了明确的决策流程图,帮助开发者在同场景下 阅读详情

相关推荐

SQL_(AND,OR,NOT)或非,内部连接(INNER JOIN),左连接(LEFT JOIN ),右连接(RIGHT JOIN)完整外部连接(FULL OUTER J

ANDOR运算符用于根据多个条件筛选记录:AND语法: 选择Java1_student中,年龄大于21并且成绩高于60的人 OR语法 选择Java1_student中,年龄小于21,或者成绩低于60的人 NOT语法 INNER JOIN 语法 Java1_student表 Java1_studentGrade表 使用 INNER JOIN连接两个表并按照成绩从高到低返回学生信息 注意: 如果表中至少有一个匹配项,关键字将返回一行。如果 “Student” 表中的行"studentGrade"

qq_43408367的博客 1477

existsinner join效率问题

    二者并没有严格的效率高低之分,甚至依赖于数据库中数据的组织方式。    exists效率依赖于匹配度,join效率则比较稳定。比如,对 select * from tableA as ta where exists (select 1from tableB as tb where  ta.id = tb.id); 每扫描ta一行,就会扫描tb,遇到匹配就返回true,没遇到

barfoo的专栏 6340

mysql的existsinner join not exists left join 性能差别惊人

由于客户数据量越来越大,在实践中让我发现mysql的existsinner join not exists left join 性能差别惊人。 我们一般在做数据插入时,想插入重复的数据,或者盘点数据在一个表,另一个表否有存在相同的数据会用not existsexists,例如: insert into t1(a1) select b1 from t2 where not exi...

ESR 研发中心 1288

关于 joinnot existsnot in的用法性能差异

好的,以下是关于JOINNOT EXISTSNOT IN的用法性能差异的长总结: 1. JOIN JOIN是将两个或多个表中的行连接起来形成一个新的表的操作,通常使用JOIN可以比使用NOT EXISTSNOT IN更高效。 使用JOIN时,可以选择INNER JOINLEFT JOIN、RIGHT JOIN同类型的JOIN操作符,根据需求来选择合适的JOIN类型。内连接(INNE...

有人想浑水摸鱼,我必须站在清水中 425

大数据量下not in, not exists, left join的比较

原文:http://blog.csdn.net/feegle_develop/article/details/5861551 /* INEXISTSLEFT JOINNOT INNOT EXISTSINNER JOIN存在存在查询效率 */   IF OBJECT_ID('A') IS NOT NULL   DROP TABLE A GO CREATE

cqin的专栏 8913

join left 大数据_大数据量下not in, not exists, left join的比较

/*INEXISTSLEFT JOINNOT INNOT EXISTSINNER JOIN存在存在查询效率*/IF OBJECT_ID('A') IS NOT NULLDROP TABLE AGOCREATE TABLE A(ID INT)GOIF OBJECT_ID('B') IS NOT NULLDROP TABLE BGOCREATE TABLE B(ID INT)GODE...

weixin_42357618的博客 537

【SQL开发实战技巧】系列(五):从执行计划看INEXISTS INNER JOIN效率,我们要分场景要死记网上结论

从执行计划角度分析INEXISTS INNER JOIN效率是死记网上结论、表的5种关联:INNER JOINLEFT JOIN、RIGHT JOIN FULL JOIN 解析【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。

赵延东的一亩三分地 9万+

【SQL开发实战技巧】系列(六):从执行计划看NOT INNOT EXISTS LEFT JOIN效率,记住内外关联条件要乱放

从执行计划看NOT INNOT EXISTS LEFT JOIN效率,还是那就话,别死记网上结论、在使用内外关联时,特别是简写方式时记住关联条件要乱放!【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。

赵延东的一亩三分地 9万+

SQL查询优化:INEXISTSJOIN聚合函数详解

SQL中EXISTSIN的主要区别在于: IN是集合运算符,用于判断某个值是否存在于子查询结果集中,子查询必须返回单列;EXISTS存在性判断,只要子查询有结果就返回真,可返回任意列。 性能差异:NOT EXISTS通常比NOT IN效率更高,因为可使用结合算法;而EXISTS一般IN高效。 适用场景同: EXISTS适合"内大外小"的查询(子查询结果集较大) IN适合"内小外大"的查询(子查询结果集较小) 语义区别: EXISTS检查子查询是否存在任何行

ywl470812087的博客 12万+

HiveSql&SparkSql —— 使用left semi joininexists类型子查询优化

LEFT SEMI JOIN(左半连接)介绍 SEMI JOIN (即等价于LEFT SEMI JOIN)最主要的使用场景就是解决EXISTS INLEFT SEMI JOIN(左半连接)是 IN/EXISTS查询的一种更高效的实现。LEFT SEMI JOIN虽然含有LEFT,但其实现效果等价于INNER JOIN,但是JOIN结果只取原左表中的列。 优化实例 实例表准备: CREATE TABLE test.user1( `id` bigint ) ROW FORMAT DELIMITED

qq_41018861的博客 3136

left semi join inner join 相同点区别

1.LEFT SEMI JOIN LEFT SEMI JOININ/EXISTS查询的一种更高效的实现。 Hive 当前没有实现 IN/EXISTS查询,所以你可以用LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都行。 SELECT a.key, a.value FROM a WHERE a.key i...

hellojoy的博客 2437

SQL 中 IN NOT IN 用法的那些事

要乱用 innot in

草原孤狼的专栏 2696

Oracle中inexistsleft join效率

也是用到了才知道,oracle in表达式参数支持最大上限1000个,是个头疼的问题, 解决思路:拆分成多个in表达式,每个表达式中参数超过1000。   或者用其他关键字:   首先,在oracle中效率排行:表连接&gt;exist&gt;not exist&gt;in&gt;not in; 因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率...

u012925172的博客 4398

exists in join 效率比较

通常情况下,3种查询方式的执行时间:EXISTS <= IN <= JOINNOT EXISTS <= NOT IN <= LEFT JOIN只有当表中字段允许NULL时,NOT IN的方式最慢:NOT EXISTS <= LEFT JOIN <= NOT IN 综上:IN的好处是逻辑直观简单(通常是独立子查询);缺点是只能判断单字段,并且当NOT ...

AFFDS1412的博客 1762

oracle left join替代,Oracle,用left join 替代 exists ,not exists,in , not in,提高效率

ORACLE的SQL JOIN方式大全ORACLE的SQL JOIN方式大全 在ORACLE数据库中,表表之间的SQL JOIN方式有多种(仅表表,还可以表视图.物化视图等联结),官方的解释如下所示 A join is a que ...oracle update left join 写法oracle update left join 写法 (修改某列,条件字段在关联表中) 案例: E:考...

weixin_32017023的博客 1627

sql中选择用in,exists还是inner joinleft join替换?

inexists对比以及优化

qq_28227405的博客 3527

mysql exists in join_SQL查询使用in,existsjoin的执行效率比较

在使用SQL语句查询数据时,有多种语句组合可以达到查询需求,但是同的语句可能效率同数据量少的时候,你可能没有发现,但是数据量大的时候,可能就会相差几分钟了。在查询表1 记录是否在或者在表2时,我们可以用INEXISTSLEFT JOINNOT INNOT EXISTSINNER JOIN等。但是他们的执行时间,下面我们来说一下1. SELECT * FROM 表1 WHERE ID...

weixin_34493871的博客 1439
上一篇: 应用场景:将员工不同的职位合并到同一列
下一篇: 从字符串里提取特殊字符
feegle_develop
博客等级 码龄17年 39粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值