in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG:
请看下面的例子:
create table t1 (c1 number,c2 number);
create table t2 (c1 number,c2 number);
insert into t1 values (1,2);
insert into t1 values (1,3);
insert into t2 values (1,2);
insert into t2 values (1,null);
select * from t1 where c2 not in (select c2 from t2);
no rows found
select * from t1 where not exists (select 1 from t2 where t1.c2=t2.c2);
c1 c2
1 3
正如所看到的,not in 出现了不期望的结果集,存在逻辑错误。如果看一下上述两个select语句的执行计划,也会不同。后者使用了hash_aj。
因此,请尽量不要使用not in(它会调用子查询),而尽量使用not exists(它会调用关联子查询)。如果子查询中返回的任意一条记录含有空值,则查询将不返回任何记录,正如上面例子所示。
除非子查询字段有非空限制,这时可以使用not in ,并且也可以通过提示让它使用hasg_aj或merge_aj连接。
分享到:
相关推荐
IN、EXISTS、NOT EXISTS、NOT IN 在 SQL 语句中的应用和区别 IN 语句和 EXISTS 语句都是 SQL 语句中用来判断是否存在某个值的语句,但是它们的实现机制和应用场景是不同的。 IN 语句是通过 hash 连接来实现的,它...
对于否定条件,即排除某些值的情况,使用“NOT IN”和“NOT EXISTS”也有类似但重要的区别。“NOT IN”会导致内外表都进行全表扫描,无法有效利用索引,而“NOT EXISTS”仍然可以利用子查询表上的索引。因此,在处理...
"SQL中对not in和not exist查询的替代算法.pdf" 本文主要讨论了SQL中对not in和not exist查询的替代算法。首先,作者简要介绍了SQL语言的基本概念和特点,然后讨论了not in和not exist查询的低效性及其原因。接着,...
标题 "does not exist. 解决 /root/.Xauthority does not exist" 涉及到的是一个常见的 Linux 系统问题,通常在使用图形界面(如 X Window System)或通过 SSH 远程连接时遇到。这个问题指出,系统找不到 `/root/....
### 经典SQL查询总结关于Exists, not Exists, IN, not IN 效率的说明 在数据库查询操作中,存在着多种方法来实现相似的功能,但不同的实现方式在性能上可能会有显著差异。本文将深入探讨 SQL 中 `EXISTS`, `NOT ...
在 Windows 操作系统中,`FILE_DOES_NOT_EXIST` 是一个错误代码,通常表示尝试访问的文件不存在于指定的位置。该错误代码在内核模式下通过 `NTSTATUS` 类型来表示,具体的值定义为 `0x00000005`。当应用程序或驱动...
“Controller does not exist.”登陆后台突然是这个提示登陆不上后台了。 入口为:index.php?m=admin 这是控制器不存在错误 应该是改过了系统文件,或者是上传文件缺失。 可以这样做,把phpcms/ 目录下的所有文件和...
通过以上分析可以看出,虽然 `NOT EXISTS`、`NOT IN` 和 `NOT NULL` 在表面上看似相似,但它们之间存在着明显的区别,尤其是在处理 `NULL` 值时。因此,在实际应用中,应根据具体需求选择合适的操作符以达到最佳效果...
安装sap gui 750后,打开smartforms或scriptforms提示:CSapEditorCtrl::GetObject: Object 13 does not exist的解决方法:安装此安装包后即可解决问题
mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
一般情况都是因为文件的上级目录不存在浏览权限。...详细说明:Serv_U安装设置以及530 Not logged in, home directory does not exist解决方法安装程序尽量采用最新版本,避免采用默认安装目录,设置好serv-u
SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句 SQL语句优化是数据库性能优化的重要方面之一。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS...
在这个压缩包文件中,虽然没有具体的标题和描述,我们可以推测它可能包含了一些特定的字体资源或者与字体设计相关的文件。 字体的基本概念包括字形、字号、字体家族和样式。字形是指单个字符的形状,如A、B等。字号...
log4j-99.0-does-not-exist.jar 处理logback和log4j的包冲突
标题 "The skin does not exist: Unable to determine the release version" 提到的问题,通常是与软件部署或更新时出现的错误有关,尤其是与版本控制或者界面显示有关。这可能是指在使用某些开源工具或框架时,系统...
解决SAPGUI800使用SMARTFORMS创建/编辑文本时报错CSapEditorCtrl::GetObject: Object 15 does not exist的对应版本SAPscript Legacy Text Editor patch安装包
Allegro中导入orCAD原理图网络表时,出现以下错误: “Symbol 'BP' for device 'BEEP_BP_BEEP' not found in PSMPATH or must be "dbdoctor"ed”
NULL 博文链接:https://snowelf.iteye.com/blog/507976
in和exist的区别 从sql编程角度来说,in直观,exists不直观多一个select, in可以用于各种子查询,而exists好像只用于关联子查询 从性能上来看 exists是用loop的方式,循环的次数影响大,外表要记录数少,内表就...
### jboss-service.xml could not be opened, does it exist 配置jboss遇到的问题 在进行JBOSS服务器的配置过程中,经常会遇到一个令人头疼的问题:“jboss-service.xml could not be opened, does it exist?”这样...