小白科普:Oracle中的“!=”与Null
Posted 小代嘚吧嘚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白科普:Oracle中的“!=”与Null相关的知识,希望对你有一定的参考价值。
云南--泸沽湖
月初修复bug,发现Oracle中的“不等于操作符”是忽略Null的...
比如,查询zhhuztai不等于A的记录,习惯用 zhhuztai <> 'A'.
认为会查询出包含Null和不等于A的记录(思维里认为Null也在" 不等于A"的区间)
而事实,仅查询出不为Null且不等于A的记录。
存款测试表,共4笔记录:
例1,查询zhhuztai不为A的记录(ERROR)
试了<>,!=后的查询结果都不符合预期,查询的都是zhhuztai非空的记录,zhhuztai为Null的记录没有查询出来。当时觉得有点小奇怪,然后就找同事聊了下,看看啥情况。结论:null只能通过is null或者is not null来判断,其它操作符与null操作都是false。
例2,查询zhhuztai字段不等于A的记录(OK)
select * from table where nvl(name,'xx')<>'xn' 来查询name字段不等于'xn'的记录。
select * from test where instr(concat(name,'xx'),'xn') = 0 来查询name字段不等于'xn'的记录。注:instr(concat(name,'xx'),'xn') = 0来判断,因为就算name为空,当和'xx'连接后,也会不为空的。
另外,看了下网上的相关文章,以下摘录于网络。
无论是单列唯一索引或复合唯一索引,对于可以为null的列或复合null值,Oracle不会为其存储索引值。故在基于单列创建B树唯一索引或多列创建B树复合唯一索引的情形下。
当列上允许为null值时:
where子句使用了基于is null的情形,其执行计划走全表扫描。
where子句使用了基于is not null的情形,其执行计划走索引扫描。
当列上不允许为null值时,存在非null约束:
where子句使用了基于is null的情行,其执行计划走索引扫描。
where子句使用了基于is not null的情形,其执行计划走索引扫描。
Null与索引使用时的建议:
1、对于用于连接或经常被谓词使用到的列应尽可能避免NULL值属性,因为它容易导致索引失效。
2、为需要使用NULL值的列添加缺省值(alter table tb modify(col default 'Y'))。
3、如果NULL值不可避免也不能使用缺省值,应考虑为该常用列使用nvl函数创建索引,或使用伪列来创建索引以提高查询性能。
4、对于复合索引应保证索引中至少有一列不为NULL值,还是因为全部列为NULL时不被索引存储,以保证使用is null是可以使用索引。
5、对于复合索引应保证索引列应使用数据类型长度最小的列来添加not null约束应节省磁盘空间。
你用过哪些数据库?它们相比与Oracle有哪些优点?那在做核心开发中,我们还要注意哪些事项呢?快来聊聊吧~
精彩回顾
1.
2.
3.
谢谢您的阅读!
如果你喜欢我的文章
欢迎转发
以上是关于小白科普:Oracle中的“!=”与Null的主要内容,如果未能解决你的问题,请参考以下文章