本节主要讨论in的原理及使用,以及常见的错误的观点。

一、in的使用
1.1 in的使用
1.1.1 内、外两表关联字段都非空
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
SQL> select count(1) from tb1 where t1 in (select t2 from tb2);
--T1=2的记录符合条件,结果符合常规思维
COUNT(1)
----------
1
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2);
--T1=1的记录符合条件,结果符合常规思维
COUNT(1)
----------
1
1.1.2 当外表关联字段无空值、内表关联列表有空值时
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
3
SQL> select count(1) from tb1 where t1 in (select t2 from tb2);
--T1=2的记录符合条件,结果符合常规思维
COUNT(1)
----------
1
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2);
--无记录符合条件,结果不符合常规思维
COUNT(1)
----------
0
SQL> select count(1) from tb1 where t1 in (select t2 from tb2 where t2 is not null);
--T1=2的记录符合条件,结果符合常规思维
COUNT(1)
----------
1
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2 where t2 is not null);
--T1=2的记录符合条件,结果符合常规思维
COUNT(1)
----------
1
1.1.3当外表关联字段有空值、内表关联列表无空值时
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
1
2 2
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
3 3
SQL> select count(1) from tb1 where t1 in (select t2 from tb2);
--T1=2的记录符合查询条件,符合常规思维
COUNT(1)
----------
1
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2);
--只有T1=2的记录符合查询条件,与常规思维相悖
COUNT(1)
----------
1
1.1.4 当内、外表的关联字段都有空值时
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
3
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
3
SQL> select count(1) from tb1 where t1 in (select t2 from tb2);
--只有t1=2的记录符合条件,与常规思维相悖
COUNT(1)
----------
1
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2);
--没有符合条件的记录,与常规思维相悖
COUNT(1)
----------
0
SQL> select count(1) from tb1 where t1 in (select t2 from tb2 where t2 is not null);
--只有t1=2的记录符合条件,符合常规思维
COUNT(1)
----------
1
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2 where t2 is not null);
--只有t1=1的记录符合条件,与常规思维相悖
COUNT(1)
----------
1
1.1.5 外表无记录
SQL> select * from tb1;
T1 NAME1
---------- ----------
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
3 3
SQL> select count(1) from tb1 where t1 in (select t2 from tb2);
--无记录返回
COUNT(1)
----------
0
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2);
--无记录返回
COUNT(1)
----------
0
这里很容易理解,无论条件成立与否,因为外表无记录,索引返回记录数为0
1.1.6 内表无记录
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
SQL> select * from tb2;
T2 NAME2
---------- ----------
SQL> select count(1) from tb1 where t1 in (select t2 from tb2);
--所有记录都不符合条件,结果符合常规思维
COUNT(1)
----------
0
SQL> select count(1) from tb1 where t1 not in (select t2 from tb2);
--所有记录都符合条件,结果符合常规思维
COUNT(1)
----------
2
1.2 in运算总结:
1.2.1单列作in运算时
1. col in (v1,v2,...vn) 相当于 (col=v1 or col=v2 or ...col=vn)
col not in (v1,v2,...vn) 相当于 (col<>v1 and col<>v2 and ...col<>vn)
2. 当in 列表的记录数大于0,且in列表(vn)有null值时,则oracle在处理 in 的时候转换成:
(col=v1 or col=v2 or col=null or ...col=vn)
所以,in列表有null值不会引起与常规思维不一样的结果
3. 当not in 列表的记录数大于0,且not in列表有null值时,oracle在处理not in 当时候转换成:
(col<>v1 and col<>v2 and col<>null and ...col<>vn),由于oracle中null是一个非常特殊的值,null与任何值做算术运算符比较都返回false,由于多个条件是用and连接的,所以这种情况整个条件是false,也就不会有记录返回。
这种情况是最容易搞混和不理解的。
4. 当in/not in 列表的记录数大于0,且col是null值时,null与任何值做算术运算符比较都返回false,根据in和not in的处理方式可知,无论是in运算还是not in 运算,oracle不会有任何记录返回。也就是说oracle在处理时相当于把col是null的记录忽略不作处理。
5. 当in/not in 列表的记录数为0时(注意与in/not in列表全为空不同),in运算相当于条件1=2;not in运算相当于1=1;
6. 在not in操作中,可以在子查询中加入col is not null使得有记录返回
1.2.2 多列作in运算时
1. (col1,col2) in ((v11,v12),(v21,v22),...(vn1,vn2))相当于
((col1=v11 and col2=v12) or (col1=v21 and col2=v21) ... or (col1=vn1 and col2=vn2))
(col1,col2) not in ((v11,v12),(v21,v22),...(vn1,vn2))相当于
((col1<>v11 or col2<>v12) and (col1<>v21 or col2<>v22) and ...(col1<>vn1 or col2<>vn2))
2. 多列in运算当原理和单列一样,把col1和col2看作一个整体col,把vn1和vn2看作一个整体vn就相当于单列作in运算了。
3. 多列运算比较特殊当两种情况是col1和col2都为null时,相当于单列中都col为null,oracle在处理这种情况时,相当于忽略这条记录;
当vn1和vn2都为null时,相当于单列运算中vn为null的情况,在作in运算时不会影响返回结果,但在作not in运算时不会有任何记录返回。
4. 当col1和col2中有一个为null时,作in运算时oracle相当于把该记录忽略不计,因为(null or null or null...)结果是null。(not in不能忽略)
5. 当col1和col2其中一个为null,且另一个的值在包含在not in列表中时,在作not in运算时oracle相当于把该记录忽略不计(null && true/false结果是null)。
6. 在not in操作中,可以在子查询加入((col1 is not null) or (col2 is not null))使得有结果返回
7. 以上小结适用于in/not in 列表的记录数大于0的情况
8. any、all运算与in类似

In和exists使用及性能分析(一):in的使用相关推荐

  1. SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)

    前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...

  2. SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

    前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...

  3. SQL Server-聚焦LEFT JOIN...IS NULL AND NOT EXISTS性能分析(十七)

    前言 本节我们来分析LEFT JOIN和NOT EXISTS,简短的内容,深入的理解,Always to review the basics. LEFT JOIN...IS NULL和NOT EXIS ...

  4. SQL Server-聚焦INNER JOIN AND IN性能分析(十四)

    前言 本节我们来讲讲联接综合知识,我们在大多教程或理论书上都在讲用哪好,哪个性能不如哪个的性能,但是真正讲到问题的实质却不是太多,所以才有了本系列每一篇的篇幅不是太多,但是肯定是我用心去查找许多资料而 ...

  5. i27岁转行java,JavaTM I/O 性能分析[转]

    JavaTM I/O 性能分析[转] 上一篇 / 下一篇  2008-07-30 13:04:44 / 个人分类:Zee的生活 这篇文章讨论和阐明了提供 JavaTM I/O 性能的多种设计问题,例如 ...

  6. php xingnengfenxi_PHP 性能分析与实验:性能的微观分析

    在上一篇文章中,我们从 PHP 是解释性语言.动态语言和底层实现等三个方面,探讨了 PHP 性能的问题.本文就深入到 PHP 的微观层面,我们来了解 PHP 在使用和编写代码过程中,性能方面,可能需要 ...

  7. Python MySQLdb 循环插入execute与批量插入executemany性能分析(list批量写法亲测成功)

    用Python连接MySQL数据库时,会用到MySQLdb库,这里下载↓↓↓ https://pypi.python.org/pypi/MySQL-python/ 这个库提供了对数据库的普遍操作,增删 ...

  8. 如何写出高性能的SQL语句,及如何进行SQL性能分析与调优

    1.尽量使用索引 索引是数据库中重要的存储结构,对于查询耗时影响甚大,应避免导致索引无效的sql语句 索引失效的场景: 1.缺失索引 2.where 条件中的or 3.where条件表字段使用函数 4 ...

  9. 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...

最新文章

  1. ieee39节点系统介绍_太原理工大学 秦文萍,逯瑞鹏等:大规模新能源接入对电气耦合综合能源系统稳定性有何影响?...
  2. 计算机英语心得体会200字,英语读后感200字精选3篇
  3. 高校c语言题库,C语言-中国大学mooc-题库零氪
  4. java请求响应中转_J2EE中的请求中转、重定向和包含关系
  5. oracle_导致实例逐出的五大问题
  6. SAP License:SD和其他模块集成要点
  7. PAT 乙级 1041. 考试座位号(15) Java版
  8. tomcat java.ext.dirs_tomcat classloader 加载class顺序
  9. hpsocket java代码_java版本调用HP-Socket服务端代码
  10. Python-OpenCV双目测距代码实现以及参数解读
  11. 如何像专业人士一样使用 Google 学术搜索
  12. html 渐变背景色,渐变文字颜色
  13. python怎么把照片转成卡通_python用OpenCV转卡通照片报错,好像是pyrdown的使用有问题?...
  14. linux下rar等各种格式的压缩包的压缩、解压方法
  15. 【Linux系统】Linux EXT2文件系统
  16. 用gulp实现代码压缩、图片压缩和项目打包
  17. `英语` 2022/8/18
  18. LeetCode 526. 优美的排列
  19. 那个服务器的联盟最多的,魔兽世界联盟最多的服务器是哪个
  20. 图形性能测试软件,3DMark05 Build 1.2.0『最为普及的3D图形卡性能测试工具』

热门文章

  1. java varargs_Java中方法重载中的Varargs
  2. linux新终端找回任务,Linux 终端任务后台执行
  3. c语言中typeof关键字
  4. python之模块之shutil模块
  5. 使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决
  6. .NET中的跟踪与调试(TraceDebug)
  7. 如何用VS2005制作Web安装程序
  8. prometheus常用语法
  9. gdal数据类型_科学网-gdal数据类型的代码的核心定义文件-林清莹的博文
  10. C# 在DbContext内通过DbSet名称来访问DbSet