小心 SQL NOT IN 子查询的结果含有 null 值时的陷阱!
2016-12-24 00:00
597 查看
摘要: 如果 NOT IN 子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。
如果 NOT IN 子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用 NOT IN,并且可以通过提示让它使用索引。
IN 是把外表和内表作 hash 连接,而 EXISTS 是对外表作 loop 循环,每次 loop 循环再对内表进行查询,一直以来认为 EXISTS 比 IN 效率高的说法是不准确的。如果查询的两个表大小相当,那么用 IN 和 EXISTS 差别不大;如果两个表中一个较小一个较大,则子查询表大的用 EXISTS,子查询表小的用 IN。
create table #t1(c1 int,c2 int); create table #t2(c1 int,c2 int); 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); -->执行结果:无 select * from #t1 where not exists(select 1 from #t2 where #t2.c2=#t1.c2) -->执行结果:1 3
如果 NOT IN 子查询中返回的任意一条记录含有空值,则查询将不返回任何记录。如果子查询字段有非空限制,这时可以使用 NOT IN,并且可以通过提示让它使用索引。
IN 是把外表和内表作 hash 连接,而 EXISTS 是对外表作 loop 循环,每次 loop 循环再对内表进行查询,一直以来认为 EXISTS 比 IN 效率高的说法是不准确的。如果查询的两个表大小相当,那么用 IN 和 EXISTS 差别不大;如果两个表中一个较小一个较大,则子查询表大的用 EXISTS,子查询表小的用 IN。
相关文章推荐
- sql server not in 问题无法正常查询结果
- T-SQL not in 遇到 null 暗含的陷阱
- 为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录
- sql语句查询时is not null 的使用
- SQL NOT IN constraint and NULL values
- Mybatis中sql语句中的in查询,一定要判断null的情况
- Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)
- Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)
- sql查询 !='' 和 is not null的区别
- mysql not in null 子查询问题
- Mybatis中sql语句中的in查询,一定要判断null的情况
- not in/not exists 的 null 陷阱
- [原]not in/not exists 的 null 陷阱
- Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)
- Oracle sql"NOT IN"语句优化,查询A表有、B表没有的数据
- Mybatis中sql语句中的in查询,一定要判断null的情况
- sql查询优化,项目中遇到的not in优化
- NULL对IN的查询的影响及解决示例.sql
- Oracle not in查不到应有的结果(NULL、IN、EXISTS详解)
- oracle SQL not in null,单列,复合列