创建一个测试表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`子句是SQL查询语句的一部分,用于指定查询条件,而`CASE WHEN`语句则是一种条件表达式,允许我们基于不同的条件返回不同的值。将`CASE WHEN`嵌套在`WHERE`子句中,可以实现更复杂的逻辑...
理解Oracle如何处理NULL值是数据库管理与查询中的重要一环,尤其对于数据完整性、查询逻辑以及函数计算等方面。 1. NULL的定义: NULL不是代表“无”或“零”,而是表示数据缺失或不可用。在SQL中,NULL被视为一种...
Oracle SQL 判断值为空OrNull 判断 Oracle SQL 中判断值为空...在 Oracle 和 SQL Server 中,我们可以使用 `NVL` 和 `ISNULL` 函数来判断值为空或 Null,並使用 `isNull` 和 `is not null` 来判断值是否为空或 Null。
### Oracle中的NULL知识点详解 #### 一、NULL基础概念与特性 在Oracle数据库中,`NULL`是一个特殊值,表示未知或未定义的状态。它既不是数字也不是字符,因此不能与其他任何类型的值进行比较。在SQL操作中,NULL的...
Oracle的WHERE子句是SQL查询语句中至关重要的一部分,它用于在从数据库中检索数据时定义特定的筛选条件。在本教程中,我们将探讨WHERE子句的语法、使用方法以及如何与其他运算符结合来增强查询功能。 首先,我们...
在处理集合时,`IN`操作符可以替代多个`OR`条件,如`WHERE job IN ('CLERK', 'MANAGER')`。模式匹配的模糊查询使用通配符, `%`代表任意数量的字符,`_`代表单个字符。例如,`WHERE ename LIKE '%SMITH%'`将找到所有...
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 ...
任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。 2. 联接列 对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表...
在处理时,需要根据业务需求来决定使用哪一个。 7. NULL合并规则: 在查询时,涉及到NULL的比较和运算会有特殊规则。例如,NULL与任何值的比较(包括NULL自身)都会返回NULL,而非布尔值。在进行聚合函数(如COUNT...
- 不应该在含有NULL值的列上建立索引,因为Oracle优化器不会在where子句中使用包含`IS NULL`或`IS NOT NULL`的索引。这会导致即使列有索引,系统也会进行全表扫描。 2. **联接列**: - 在联接查询中,如果where...
在Oracle环境中处理并发问题主要涉及两个核心方面: 1. **分析业务并发需求**:首先需要明确具体的应用场景和业务流程,以便于了解哪些数据或事务在高并发情况下容易出现问题。 2. **确定合适的并发处理机制**:...
Oracle database 的优化器在遇到 is null 或 is not null 条件时,不会使用索引,这可能会导致 SQL 语句的执行效率下降。 4. 对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的 在编写 SQL ...
- **IN/NOT IN操作符优化**:在业务密集的SQL中尽量避免使用`IN`和`NOT IN`操作符,可以使用`EXISTS`或`NOT EXISTS`来代替,以提高性能。同时,如果使用`IN`操作符,应将出现频率最高的值放在列表的前面。 - **IS ...
=`)、一般比较(如`>`, `, `>=`, `)、范围查询(`BETWEEN`)、枚举查询(`IN`,`NOT IN`)以及空值处理(`IS NULL`, `IS NOT NULL`)。例如,可以使用`WHERE`子句结合这些条件来筛选特定部门、工资范围或特定名称...
15. **IN和NOT IN运算符**:`IN`和`NOT IN`用于筛选满足或不满足指定列表条件的记录,如`WHERE empno NOT IN (7369, 7499);`。 16. **LIKE通配符**:`LIKE`配合 `%` 和 `_` 用于模糊匹配,如`WHERE hiredate LIKE '...
当子查询结果可能包含NULL时,不应使用`NOT IN`,因为它会排除所有包含NULL的结果。而`IN`则不会有问题,即使子查询结果中有NULL。如果要排除NULL,可以在子查询中添加`WHERE`子句。 这些优化技巧能帮助提升SQL查询...
根据提供的标题、描述、标签及部分内容,我们可以整理出与Oracle PL/SQL相关的多个知识点,具体包括以下几个方面: ### Oracle PL/SQL 基础 **标题:** Oracle PL/SQL语句大全 **描述:** Oracle PL/SQL是Oracle...
Oracle中处理`NULL`的方式略有不同,但基本原理相似: 1. **不考虑`NULL`值的COUNT统计**: ```sql SELECT COUNT(*), COUNT(pid), COUNT(DECODE(pid, NULL, '', pid)) FROM tbl_user WHERE pid IS NOT NULL; ``` ...