SQL中的not in 与 not exists
程序员文章站
2022-03-26 09:51:06
一. in 和 existsin是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询 。select * from TABLE1 a where a.id in (select b.id from TABLE2 b); --用到了TABLE1表上id列的索引,而子查询里的表的索引没用到;select * from TABLE1 a where exists (select b.id from TABLE2 where b.id=a.id); -- 用...
一. in
和 exists
in
是把外表和内表作hash连接,而exists
是对外表作loop循环,每次loop循环再对内表进行查询 。
select * from TABLE1 a where a.id in (select b.id from TABLE2 b); --用到了TABLE1表上id列的索引,而子查询里的表的索引没用到;
select * from TABLE1 a where exists (select b.id from TABLE2 where b.id=a.id); -- 用到了子查询里的表TABLE2表上id列的索引。
-- 备注:TABLE1与TABLE2两个表大小相当,用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in;速度较快。
二. not in
和 not exists
SELECT * FROM TABLE1 a WHERE a.id NOT IN (SELECT b.id FROM TABLE2 b);
SELECT * FROM TABLE1 a WHERE NOT EXISTS (SELECT b.id FROM TABLE2 b WHERE a.ID = b.ID);
not in
(会调用子查询), not exists
(会调用关联子查询)
- 如果子查询中返回的任意一条记录含有空值,使用
not in
则查询将不返回任何记录; - 如果子查询字段有非空限制,则可以使用
not in
; - 如果查询语句使用了
not in
,那么对内外表都进行全表扫描,没有用到索引;而用not exists
的子查询依然能用到表上的索引。
备注: 如果子查询结果有任意一套记录含有null,使用 not in 查询不出来结果。
本文地址:https://blog.csdn.net/hyfstyle/article/details/110544006
上一篇: AMD老三代锐龙无缘SAM加速技术:Intel四代酷睿就可以
下一篇: SSM框架之Spring简介
推荐阅读
-
关于python中的__init__与__new__以及__call__三个方法的简单介绍
-
JavaScript中的原型与原型链详解
-
Android中ACTION_CANCEL的触发机制与滑出子view的情况
-
Oracle中优化SQL的原则
-
解析Java的Jackson库中对象的序列化与数据泛型绑定
-
php中实现xml与mysql数据相互转换的方法_php技巧
-
MySQL 存储过程中执行动态SQL语句的方法_MySQL
-
详细分析mybatis中resultType和resultMap的区别与联系
-
详解 objective-c中interface与protocol的作用
-
C#类中属性与成员变量的使用小结