NULL
定义:
null表示no value,unknown,它不表示0,也不表示一个空的字符串。
SQL函数中的NULL
所有的函数,除了REPLACE , NVL , CONCAT以外,如果你用null作为它的参数,那么结果就是返回null。
大部分的聚集函数如(COUNT,AVG),他们会忽略null,如一个列上面有10行记录,其中2行是null,那么count这个列的结果就是8。
例如
在增加月份函数中使用null进行计算的情况:
SQL> select to_char(sysdate,'yyyy-mm-dd') today from dual;
TODAY
----------
2007-09-23
SQL> select to_char(add_months(sysdate,1),'yyyy-mm-dd') another_day from dual;
ANOTHER_DA
----------
2007-10-23
SQL> select to_char(add_months(sysdate,null),'yyyy-mm-dd') another_day from dual;
ANOTHER_DA
----------
聚集函数的情况:
22:11:28 SQL> select empno,ename,comm from emp;
EMPNO ENAME COMM
---------- ---------- ----------
7369 SMITH
7499 ALLEN 300
7521 WARD 500
7566 JONES
7654 MARTIN 1400
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER 0
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
已选择14行。
22:11:43 SQL> select count(empno) from emp;
COUNT(EMPNO)
------------------------
14
22:12:05 SQL> select count(comm) from emp;
COUNT(COMM)
-----------------------
4
条件中的null。
对NULL所进行的任何数学计算结果都是null,如10+null结果是null。
oracle始终认为两个null是不相等的(除了少数情况),不能用null=null这个条件来进行判断两个null是否相等,null不等于其他的null,你只能用is null或者is not null来判断某个记录的某个字段是不是null。
但是oracle在使用decode函数的时候,它认为两个null是相等的。
oracle还有一种情况也认为两个不同的null是相等的,就是在一个复合键中,如果这两个复合键值中非null部分是相等的,那么这两个复合键值是相等的。
下面给出null出现的条件表格:
|
如果a是 |
比较条件是 |
那么结果是 |
|
10 |
a IS NULL |
FALSE |
|
10 |
a IS NOT NULL |
TRUE |
|
NULL |
a IS NULL |
TRUE |
|
NULL |
a IS NOT NULL |
FALSE |
|
10 |
a = NULL |
UNKNOWN(其实就是null) |
|
10 |
a != NULL |
UNKNOWN |
|
NULL |
a = NULL |
UNKNOWN |
|
NULL |
a != NULL |
UNKNOWN |
|
NULL |
a = 10 |
UNKNOWN |
|
NULL |
a != 10 |
UNKNOWN |
例如:
22:25:00 SQL> select empno,ename,comm from emp;
EMPNO ENAME COMM
---------- ---------- ----------
7369 SMITH
7499 ALLEN 300
7521 WARD 500
7566 JONES
7654 MARTIN 1400
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER 0
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
已选择14行。
已用时间: 00: 00: 00.09
22:25:06 SQL> select empno,ename,comm from emp where comm=null;
未选定行
已用时间: 00: 00: 00.01
22:25:14 SQL> select empno,ename,comm from emp where comm <> null;
未选定行
已用时间: 00: 00: 00.01
22:25:21 SQL> select empno,ename,comm from emp where comm is null;
EMPNO ENAME COMM
---------- ---------- ----------
7369 SMITH
7566 JONES
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER
已选择10行。
已用时间: 00: 00: 00.04
22:25:27 SQL> select empno,ename,comm from emp where comm is not null;
EMPNO ENAME COMM
---------- ---------- ----------
7499 ALLEN 300
7521 WARD 500
7654 MARTIN 1400
7844 TURNER 0
已用时间: 00: 00: 00.01