假设有一张表格table1
col_a |
col_b |
(空格) |
1 |
2 |
|
3 |
|
a |
查询:
select * from table1 where col_a = '' --0条记录
select * from table1 where col_a is null --3条记录
select * from table1 where col_a !='a' --1条记录
解释:null的意义:没有值,不等价于任何值,是一个未知数,当null作为条件进行操作时,就不能用"="(虽然语法没有错),即不能定值判断,应该使用is Null 或者 is not Null
is null/ is not null语句外,对Null的操作均不会出现返回在结果中
插入:
插入空字符串的时候会自动转化为null,在Oracle中没有空字符串,只有null,例如:
insert into table1 values(null, null); -- 插入NULL,插入成功
insert into table1 values('a', ''); -- 第二个字段类型为int型,但还是能插入成功,再次证明,’’ 被当作了null处理,如果是字符串,执行会报错
函数:
在使用AVG,MAX,SUM,COUNT等函数时,为NULL的纪录往往会被忽略。
例如:
select AVG(col_b) from table1; -- 结果为 2 ,NULL的纪录行忽略掉了
select MAX(col_b) from table1; -- 结果为 3
select SUM(col_b) from table1; -- 结果为 6
select COUNT(col_b) from table1; -- 结果为 3
select COUNT(col_a) from table1; -- 结果为 2
select COUNT(*) from table1; -- 结果为 5
排序:
select * from table1 order by address -- null值会排在后面
select * from table1 order by address desc -- null值会排在前面
Order by排序时缺省认为null是最大值,ASC升序则被排在最后,而DESC降序则排在最前
解决:如果要改变排序方式,可以:
1. 使用 nvl 函数,例如在排序中使用ORDER BY NVL(FIELD, '0')
2. 使用其它函数,例如:decode,case
3. nulls first或nulls last(注:Nulls first:表示null值的记录将排在最前;Nulls last:表示null值的记录将排在最后),例:
select * from table1 order by aac001 asc nulls first --null值始终放在最前面
select * from table1 order by aac001 desc nulls last --null值始终放在最后面
计算:
对NULL的=、!=、>、<、>=、<=等操作的结果都为NULL。
对NULL进行+、-、*、/等操作的结果也都为NULL。
AND操作:
AND |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
FALSE |
NULL |
FALSE |
FALSE |
FALSE |
FALSE |
NULL |
NULL |
FALSE |
NULL |
OR操作:
OR |
TRUE |
FALSE |
NULL |
TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
TRUE |
FALSE |
NULL |
NULL |
TRUE |
NULL |
NULL |