在我们不知道具体有什么数据的时候,也即未知,可以用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(*)