小白科普:Oracle中的“!=”与Null

Posted 小代嘚吧嘚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白科普:Oracle中的“!=”与Null相关的知识,希望对你有一定的参考价值。

云南--泸沽湖


月初修复bug,发现Oracle中的“不等于操作符”是忽略Null的...


比如,查询zhhuztai不等于A的记录,习惯用 zhhuztai <> 'A'.

认为会查询出包含Null和不等于A的记录(思维里认为Null也在" 不等于A"的区间)

而事实,仅查询出不为Null且不等于A的记录


存款测试表,共4笔记录:

小白科普:Oracle中的“!=”与Null


例1,查询zhhuztai不为A的记录(ERROR)

小白科普:Oracle中的“!=”与Null

试了<>,!=后的查询结果都不符合预期,查询的都是zhhuztai非空的记录,zhhuztai为Null的记录没有查询出来。当时觉得有点小奇怪,然后就找同事聊了下,看看啥情况。结论:null只能通过is null或者is not null来判断,其它操作符与null操作都是false。


例2,查询zhhuztai字段不等于A的记录(OK)

小白科普:Oracle中的“!=”与Null


小白科普:Oracle中的“!=”与Null

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的主要内容,如果未能解决你的问题,请参考以下文章

科普小白入门——虚拟化的常见类型

小白科普:死锁

写给小白的云计算入门科普

小白科普:Netty有什么用?

小白科普:虚拟化简史

《网络安全》零基础教程-适合小白科普