oracle中的null

在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零。
 
ORACLE允许任何一种数据类型的字段为空,除了以下两种情况:
1、主键字段(primary key),
2、定义时已经加了NOT NULL限制条件的字段
 
说明:
1、等价于没有任何值、是未知数,NULL与0、空字符串、空格都不同。
  SQL> SELECT 1 FROM dual WHERE ''='';
  未选择任何行
  SQL> select 1 from dual where ''=null;
  未选择任何行
  SQL> SELECT 1 FROM dual WHERE NULL = NULL;
  未选择任何行
  SQL> select 1 from dual where null = 0;        
  未选择任何行 
  SQL> select 1 from dual where '' is null;
           1
  ----------
           1  
  SQL> SELECT 1 FROM dual WHERE NULL IS NULL;
           1
  ----------
           1
2、对空值做加、减、乘、除等运算操作,结果仍为空。如果where条件中出现这种比较,就是未知,相当于false,进而不返回数据
   SQL> select 1 from dual where (select 1+null from dual) is null
   SQL> select 1 from dual where (select 1-null from dual) is null
   SQL> select 1 from dual where (select 1*null from dual) is null
   SQL> select 1 from dual where (select 1/null from dual) is null
  
   注:not in的情况
   SQL> select 1 from dual where 'b' not in ('a', null)  
   SQL> select 1 from dual where 'b'!='a' and 'b'!=null
   -- 以上两句是对等的,因为'b'!=null始终返回的是null,所以真值表达式也始终不成立,进而不返回任何的数据。
   -- 正确的做法应该是排除null的情况,比如在括号中排除null值的出现
3、NULL的处理使用NVL函数。
   SQL> select 1 from dual where nvl(null,0)=nvl(null,0);
4、比较时使用关键字用“is null”和“is not null”。
   SQL> select 1 from dual where '' is null;
   SQL> select 1 from dual where '' is not null;
5、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查。
   ????
6、排序
  1)不加“关照”的情况下,我们可以把那些NULL值假想为所有内容中值是最大的,因此,升序排序后NULL值在最后,倒序排序后NULL值在最前!
  2)特殊“关照”的情况下,当指定“NULLS FIRST”时,无论是升序排序还是倒序排序,NULL值都会排列在最前面;当指定“NULLS LAST”时,无论是升序排序还是倒序排序,NULL值都会排列在最后面。

7、大多数的聚合函数会忽略null,例如
  1)avg,1000、null、null、2000,使用avg取平均值,实际上是(1000+2000)/2,所以特殊情况下,最好是取和然后在除以结果集数量
  2)count,1000、null、null、2000,得到的结果是2,最好是使用count(1)或count(*)

posted @ 2016-08-19 09:17  远方V3  阅读(1433)  评论(0编辑  收藏  举报