`

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 where case when where后面跟case when

    在Oracle数据库中,`WHERE`子句是SQL查询语句的一部分,用于指定查询条件,而`CASE WHEN`语句则是一种条件表达式,允许我们基于不同的条件返回不同的值。将`CASE WHEN`嵌套在`WHERE`子句中,可以实现更复杂的逻辑...

    oracle中对null值的处理

    理解Oracle如何处理NULL值是数据库管理与查询中的重要一环,尤其对于数据完整性、查询逻辑以及函数计算等方面。 1. NULL的定义: NULL不是代表“无”或“零”,而是表示数据缺失或不可用。在SQL中,NULL被视为一种...

    oraclesql判断值为空-Oracle-sqlserver的空值(null)判断.pdf

    Oracle SQL 判断值为空OrNull 判断 Oracle SQL 中判断值为空...在 Oracle 和 SQL Server 中,我们可以使用 `NVL` 和 `ISNULL` 函数来判断值为空或 Null,並使用 `isNull` 和 `is not null` 来判断值是否为空或 Null。

    oracle中的null_考试题目

    ### Oracle中的NULL知识点详解 #### 一、NULL基础概念与特性 在Oracle数据库中,`NULL`是一个特殊值,表示未知或未定义的状态。它既不是数字也不是字符,因此不能与其他任何类型的值进行比较。在SQL操作中,NULL的...

    08.Oracle的where子句1

    Oracle的WHERE子句是SQL查询语句中至关重要的一部分,它用于在从数据库中检索数据时定义特定的筛选条件。在本教程中,我们将探讨WHERE子句的语法、使用方法以及如何与其他运算符结合来增强查询功能。 首先,我们...

    oracle/SQL和PL/SQL课堂笔记

    在处理集合时,`IN`操作符可以替代多个`OR`条件,如`WHERE job IN ('CLERK', 'MANAGER')`。模式匹配的模糊查询使用通配符, `%`代表任意数量的字符,`_`代表单个字符。例如,`WHERE ename LIKE '%SMITH%'`将找到所有...

    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数据库的sql优化

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

    如何将数据库中的NUll写入到数据库中去

    在处理时,需要根据业务需求来决定使用哪一个。 7. NULL合并规则: 在查询时,涉及到NULL的比较和运算会有特殊规则。例如,NULL与任何值的比较(包括NULL自身)都会返回NULL,而非布尔值。在进行聚合函数(如COUNT...

    数据库面试题4 oracle笔试 oracle例题

    - 不应该在含有NULL值的列上建立索引,因为Oracle优化器不会在where子句中使用包含`IS NULL`或`IS NOT NULL`的索引。这会导致即使列有索引,系统也会进行全表扫描。 2. **联接列**: - 在联接查询中,如果where...

    Oracle并发问题处理

    在Oracle环境中处理并发问题主要涉及两个核心方面: 1. **分析业务并发需求**:首先需要明确具体的应用场景和业务流程,以便于了解哪些数据或事务在高并发情况下容易出现问题。 2. **确定合适的并发处理机制**:...

    Oracle高效SQL语句原则

    Oracle database 的优化器在遇到 is null 或 is not null 条件时,不会使用索引,这可能会导致 SQL 语句的执行效率下降。 4. 对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的 在编写 SQL ...

    oracle sql调优原则

    - **IN/NOT IN操作符优化**:在业务密集的SQL中尽量避免使用`IN`和`NOT IN`操作符,可以使用`EXISTS`或`NOT EXISTS`来代替,以提高性能。同时,如果使用`IN`操作符,应将出现频率最高的值放在列表的前面。 - **IS ...

    Oracle1.pdf

    =`)、一般比较(如`>`, `, `>=`, `)、范围查询(`BETWEEN`)、枚举查询(`IN`,`NOT IN`)以及空值处理(`IS NULL`, `IS NOT NULL`)。例如,可以使用`WHERE`子句结合这些条件来筛选特定部门、工资范围或特定名称...

    Oracle经典的SQL语句训练(100例).doc

    15. **IN和NOT IN运算符**:`IN`和`NOT IN`用于筛选满足或不满足指定列表条件的记录,如`WHERE empno NOT IN (7369, 7499);`。 16. **LIKE通配符**:`LIKE`配合 `%` 和 `_` 用于模糊匹配,如`WHERE hiredate LIKE '...

    Oracle学习笔记(传智播客 赵强)

    当子查询结果可能包含NULL时,不应使用`NOT IN`,因为它会排除所有包含NULL的结果。而`IN`则不会有问题,即使子查询结果中有NULL。如果要排除NULL,可以在子查询中添加`WHERE`子句。 这些优化技巧能帮助提升SQL查询...

    oracle_plsql语句大全

    根据提供的标题、描述、标签及部分内容,我们可以整理出与Oracle PL/SQL相关的多个知识点,具体包括以下几个方面: ### Oracle PL/SQL 基础 **标题:** Oracle PL/SQL语句大全 **描述:** Oracle PL/SQL是Oracle...

    sql中null值对count的影响

    Oracle中处理`NULL`的方式略有不同,但基本原理相似: 1. **不考虑`NULL`值的COUNT统计**: ```sql SELECT COUNT(*), COUNT(pid), COUNT(DECODE(pid, NULL, '', pid)) FROM tbl_user WHERE pid IS NOT NULL; ``` ...

Global site tag (gtag.js) - Google Analytics