`

Oracle的where条件in/not in中包含NULL时的处理

 
阅读更多
创建一个测试表t_inlinuxidc@TEST>create table t_in(id number);   Table created.   linuxidc@TEST>insert into t_in values(1);   1 row created.   linuxidc@TEST>insert into t_in values(2);   1 row created.   linuxidc@TEST>insert into t_in values(3);   1 row created.   linuxidc@TEST>insert into t_in values(null);   1 row created.   linuxidc@TEST>insert into t_in values(4);   1 row created.   linuxidc@TEST>commit;   Commit complete.   linuxidc@TEST>select * from t_in;       ID ----------     1     2     3       4现在t_in表中有5条记录1、in条件中不包含NULL的情况12345678 linuxidc@TEST>select * from t_in where id in (1,3);       ID ----------     1     3   2 rows selected.上面的条件等价于id =1 or id = 3得到的结果正好是2;查看执行计划中可以看到 2 - filter("ID"=1 OR "ID"=3)说明我们前面的猜测是正确的2、in条件包含NULL的情况linuxidc@TEST>select * from t_in where id in (1,3,null);       ID ----------     1     3   2 rows selected.上面的条件等价于id = 1 or id = 3 or id = null,我们来看 http://www.cppentry.com  编程开发 程序员入门下图当有id = null条件时Oracle如何处理从上图可以看出当不管id值为NULL值或非NULL值,id = NULL的结果都是UNKNOWN,也相当于FALSE。所以上面的查结果只查出了1和3两条记录。查看执行计划看到优化器对IN的改写3、not in条件中不包含NULL值的情况linuxidc@TEST>select * from t_in where id not in (1,3);       ID ----------     2     4   2 rows selected.上面查询的where条件等价于id != 1 and id !=3,另外t_in表中有一行为null,它虽然满足!=1和!=3但根据上面的规则,NULL与其他值做=或!=比较结果都是UNKNOWN,所以也只查出了2和4。从执行计划中看到优化器对IN的改写4、not in条件中包含NULL值的情况linuxidc@TEST>select * from t_in where id not in (1,3,null);   no rows selected上面查询的where条件等价于id!=1 and id!=3 and id!=null,根据上面的规则,NULL与其他值做=或!=比较结果都是UNKNOWN,所以整个条件就相当于FALSE的,最终没有查出数据。从执行计划中查看优化器对IN的改写总结一下,使用in做条件时时始终查不到目标列包含NULL值的行,如果not in条件中包含null值,则不会返回任何结果,包含in中含有子查询。所以在实际的工作中一定要注意not in里包含的子查询是否包含null值。linuxidc@TEST>select * from t_in where id not in (select id from t_in where id = 1 or id is null);   no rows selected官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements005.htm#SQLRF51096 http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions013.htm#SQLRF52169 http://docs.oracle.com/cd/E11882_01/server.112/e41084/conditions004.htm#SQLRF52116
分享到:
评论

相关推荐

    Oracle练习笔试大全

    21、select ename, sal, comm from emp where sal not in (800, 1500,2000); //(可以对in指定的条件进行取反) 22、select ename from emp where ename like '%ALL%'; //(模糊查询) 23、select ename from emp ...

    oracle管理及优化文档 粗略整理

    在设计表的时,把索引列设置为not null 5。尽量不用通配符 %或者_ 作为查询字符串的第一个字符。当他们作为第一 个字符时,索引不会使用, 6,where 子句中避免在索引列上使用计算 如果索引不是基于函数的,...

    李兴华Oracle数据库全套课堂笔记

    SELECT*FROM emp WHERE comm IS NOT NULL; SELECT*FROM emp WHERE NOT comm IS NULL; 范例:查询出雇员编号为7369、7566、7839、8899(不存在)的雇员信息。 SELECT*FROM emp WHERE empno=7369 OR empno= 7839 OR...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     删除环境变量中的PATHT CLASSPATH中包含Oracle的值。  删除“开始”/“程序”中所有Oracle的组和图标。  删除所有与Oracle相关的目录,包括: C:\Program file\Oracle目录。 ORACLE_BASE目录。 C:\Documents ...

    oracle公司内部的培训资料

    Les10 : 约束[NOT NULL / UNIQUE / PRIMARY KEY / FOREIGN KEY / CHECK] Les11 : 视图[CREATE OR REPLACE VIEW empvu80 (id_number, name, sal, department_id) AS ... ] Les12 : 其它数据库对象[序列/索引/私有和...

    oracle实验报告

    (4)SELECT语句中的WHERE条件可以包含PL/SQL块中定义的变量及表达式,但变量名不要同数据库表列名相同。 (5)在未使用显式游标的情况下,使用SELECT语句必须保证只有一条记录返回,否则会产生异常情况。 [例3-1] ...

    Oracle数据库、SQL

    8.3当组函数要处理的所有值都为null时 16 8.4行级信息和组级信息 16 九、 group by子句 17 9.1语法和执行顺序 17 9.2分组过程 17 9.3常见错误 17 9.4多列分组 17 十、 having子句 18 10.1语法和执行顺序 18 10.2执行...

    oracle培训资料

    WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOT IN、BETWEEN、LIKE、IS NOT NULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)ORDER BY...

    有关于oracle数据库的sql优化

     任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。  2. 联接列  对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表...

    Oracle数据库Sql性能调优

    1.36 避免在索引列上使用IS NULL和IS NOT NULL 22 1.37 总是使用索引的第一个列 23 1.38 ORACLE内部操作 23 1.39 用UNION-ALL 替换UNION ( 如果有可能的话) 24 1.40 使用提示(HINTS) 25 1.41 用WHERE替代ORDER BY 25...

    Oracle_Database_11g完全参考手册.part3/3

    他的畅销书包括《Oracle Database 11gDBA手册》、Oracle Advanced Tuning and Administration和Oracle SOL&PL;/SQL Annotated Archives。他也为业界的多种杂志撰写了很多技术文章。他经常以贵宾身份出席在北美和...

    Oracle_Database_11g完全参考手册.part2/3

    他的畅销书包括《Oracle Database 11gDBA手册》、Oracle Advanced Tuning and Administration和Oracle SOL&PL;/SQL Annotated Archives。他也为业界的多种杂志撰写了很多技术文章。他经常以贵宾身份出席在北美和...

    ORACLE应用中常见的傻瓜问题1000问-1

    ORACLE应用中常见的傻瓜问题1000问 <br> 14. 如何查看系统被锁的事务时间? <br> select * from v$locked_object ; <br> 15. 如何以archivelog的方式运行oracle。 <br> init.ora <br> log_...

    oracle数据库经典题目

    1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程。 2.标准的SQL语言语句类型可以分为:数据定义语句(DDL)、数据操纵语句(DML)和数据控制语句(DCL)。 3.在需要滤除查询结果中重复的行时,必须...

    oracle中通配符和运算符的使用方法介绍

     包含:in、not in exists、not exists  范围:between…and、not between….and  匹配测试:like、not like  Null测试:is null、is not null  布尔链接:and、or、not  通配符:  在where子句中,...

    获取top前10个Oracle的进程(支持多实例)

    TCHNO"),'N',NULL,"A2"."SDBATCHNO"),"A2"."SDPROMPRICE" FROM "POS" ."SALEDETAIL"@! "A2" WHERE TO_CHAR("A2"."SDSWAPDATE",'yymmdd')|| SUBSTRB("A2"."SDMKTNO",(-3))||SUBSTRB("A2"."SDPOSNO",(-2))||SUBS TRB...

    PL/SQL 基础.doc

    语法 Var_name [CONSTANT](标识常量,可选) type [NOT NULL](标识为not-null后必须在后面初始化) [:=value](赋值,初始化); Var_name [CONSTANT](标识常量,可选) type [NOT NULL] [ default value](赋值,初始化)...

    Oracle事例

    update a set aa=null where aa is not null; delete from a where rowid!= (select max(rowid) from a b where a.aa=b.aa); 13、删除同其他表相同的行 delete from a where exits (select \'X\' from b ...

    Oracle练习.txt

    SQL> select * from user_tab_comments where comments is not null; 5.如何在ORACLE中取毫秒? select systimestamp from dual; 6.如何在字符串里加回车? 添加一个||chr(10) select 'Welcome to visit'||chr(10)...

    Oracle数据库使用及命名规则的详解

     login_id VARCHAR2(32) NOT NULL, -- 会员标识 三、 缩进 低级别语句在高级别语句后的,一般缩进4个空格:  DECLARE  v_MemberId VARCHAR2(32),  BEGIN  SELECT admin_member_id INTO v_MemberId  ...

Global site tag (gtag.js) - Google Analytics