因為空白值表示缺少資料,所以空值和其它值沒有可比性,即不能用等於、不等於、大於或小於和其它數值比較,當然也包括空值本身(但是在decode中例外,兩個空值被認為是等價)。測試空值只能用比較操作符IS NULL 和IS NOT NULL。如果使用帶有其它比較操作符的條件運算式,並且其結果依賴於空值,那麼其結果必定是NULL。在where條件中,Oracle認為結果為NULL的條件為FALSE,帶有這樣條件的select語句不返回行,也不返回錯誤資訊。
例如查詢EMP表中MGR為NULL的行:
SQL>select * from emp where mgr='';
no rows selected
SQL>select * from emp where mgr=null;
no rows selected
SQL>select * from emp where mgr is null;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
7839 KING PRESIDENT 17-NOV-81 5000 10
第1、2句寫法不妥,WHERE條件結果為NULL,不返回行。第三句正確,返回MGR為空白值的行。
三、 空值和操作符
1.空值和邏輯操作符
邏輯操作符
運算式
結果
AND
NULL AND TRUE
NULL
NULL AND FALSE
FALSE
NULL AND NULL
NULL
OR
NULL OR TRUE
TRUE
NULL OR FALSE
NULL
NULL OR NULL
NULL
NOT
NOT NULL
NULL
可以看到,在真值表中,除NULL AND FALSE 結果為FALSE、NULL OR TRUE結果為TRUE以外,其它結果均為NULL。
雖然在where條件中,Oracle認為結果為NULL的WHERE條件為FALSE,但在條件運算式中NULL不同於FALSE。例如在NOT ( NULL AND FALSE )和NOT ( NULL AND NULL )二者中僅有一處FALSE和TRUE的區別,但NOT ( NULL AND FALSE )的結果為 TRUE,而NOT ( NULL AND NULL )的結果為NULL。
下面舉例說明空值和邏輯操作符的用法:
SQL> select * from emp where not comm=null and comm!=0;
no rows selected
SQL> select * from emp where not ( not comm=null and comm!=0 );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
第一個Select語句,條件“not comm=null and comm!=0”等價於NULL AND COMM!=0。對於任意一行,如果COMM為不等於0的數值,條件等價於NULL AND TRUE,結果為NULL;如果COMM等於0,條件等價於NULL AND FALSE,結果為FALSE。所以,最終結果不返回行。
(1)IS [NOT] NULL:是用來測試空值的唯一操作符(見“空值的測試”)。
(2)=、!=、>=、<=、>、<
SQL>select ename,sal,comm from emp where sal>comm;
ENAME SAL COMM
---------- --------- ---------
ALLEN 1600 300
WARD 1250 500
TURNER 1500 0
sal或comm為空白值的行,sal>comm比較結果為NULL,所以凡是sal或comm為空白值的行都沒有返回。
(3)IN和NOT IN操作符
SQL>select ename,mgr from emp where mgr in (7902,NULL);
ENAME MGR
---------- ---------
SMITH 7902
在上述語句中,條件“mgr in (7902,NULL)”等價於mgr=7902 or mgr=NULL。對於表EMP中的任意一行,如果mgr為NULL,則上述條件等價於NULL OR NULL,即為NULL;如果mgr為不等於7902的數值,則上述條件等價於FALSE OR NULL,即為NULL;如果mgr等於7902,則上述條件等價於TRUE OR NULL,即為TRUE。所以,最終結果能返回mgr等於7902的行。
SQL>select deptno from emp where deptno not in ('10',NULL);
no rows selected
在上述語句中,條件“deptno not in ('10',NULL)”等價於deptno!='10' and deptno!=NULL,對於EMP表中的任意一行,條件的結果只能為NULL或FALSE,所以不返回行。
(4)any,some
SQL>select ename,sal from emp where sal> any(3000,null);
ENAME SAL
---------- ---------
KING 5000
條件“sal> any(3000,null)”等價於sal>3000 or sal>null。類似前述(3)第一句,最終結果返回所有sal>3000的行。
(5)All
SQL>select ename,sal from emp where sal> all(3000,null);
no rows selected
條件“sal> all(3000,null)”等價於sal>3000 and sal>null, 結果只能為NULL或FALSE,所以不返回行。
(6)(not)between
SQL>select ename,sal from emp where sal between null and 3000;
no rows selected
條件“sal between null and 3000”等價於sal>=null and sal<=3000, 結果只能為NULL或FALSE,所以不返回行。
SQL>select ename,sal from emp where sal not between null and 3000;
ENAME SAL
---------- ---------
KING 5000
條件“sal not between null and 3000”等價於sal<null or sal>3000,類似前述(3)的第一句,結果返回sal>3000的行。
下表為比較操作符和空值的小結:
比較操作符
運算式(例:A、B是NULL、C=10)
結果
IS NULL、IS NOT NULL
A IS NULL
TRUE
A IS NOT NULL
FALSE
C IS NULL
FALSE
C IS NOT NULL
TRUE
=、!=、>=、<=、>、<
A = NULL
NULL
A > NULL
NULL
C = NULL
NULL
C > NULL
NULL
IN (=ANY)
A IN (10,NULL)
NULL
C IN (10,NULL)
TRUE
C IN (20,NULL)
NULL
NOT IN
(等價於!=ALL)
A NOT IN (20,NULL)
NULL
C NOT IN (20,NULL)
FALSE
C NOT IN (10,NULL)
NULL
ANY,SOME
A > ANY(5,NULL)
NULL
C > ANY(5,NULL)
TRUE
C > ANY(15,NULL)
NULL
ALL
A > ALL(5,NULL)
NULL
C > ALL(5,NULL)
NULL
C > ALL(15,NULL)
FALSE
(NOT)BETWEEN
A BETWEEN 5 AND NULL
NULL
(2)字元操作符||:因為ORACLE目前處理零個字元值的方法與處理空值的方法相同(日後的版本中不一定仍然如此),所以對於||,空值等價於零個字元值。例:
SQL>select ename,mgr,ename||mgr,sal,comm,sal+comm from emp;
ENAME MGR ENAME||MGR SAL COMM SAL+COMM
---------- --------- ------------- --------- --------- ---------
SMITH 7902 SMITH7902 800
ALLEN 7698 ALLEN7698 1600 300 1900
WARD 7698 WARD7698 1250 500 1750
JONES 7839 JONES7839 2975
MARTIN 7698 MARTIN7698 1250 1400 2650
BLAKE 7839 BLAKE7839 2850
CLARK 7839 CLARK7839 2450
SCOTT 7566 SCOTT7566 3000
KING KING 5000
TURNER 7698 TURNER7698 1500 0 1500
ADAMS 7788 ADAMS7788 1100
JAMES 7698 JAMES7698 950
FORD 7566 FORD7566 3000
MILLER 7782 MILLER7782 1300
我們可以看到,凡mgr為空白值的,ename||mgr結果等於ename;凡是comm為空白值的行,sal+comm均為空白值。
四、空值和函數
1.空值和度量函數
對於度量函數,如果給定的參數為空白值,則其(NVL、TRANSLATE除外)傳回值為空白值。如下例中的ABS(COMM),如果COMM為空白值,ABS(COMM)為空白值。
SQL> select ename,sal,comm,abs(comm) from emp where sal<1500;
ENAME SAL COMM ABS(COMM)
---------- --------- --------- ---------
SMITH 800
WARD 1250 500 500
MARTIN 1250 1400 1400
ADAMS 1100
JAMES 950
MILLER 1300
1.空值在排序時大於任何值。例如:
SQL> select ename,comm from emp where deptno='30' order by comm;
ENAME COMM
---------- ---------
TURNER 0
ALLEN 300
WARD 500
MARTIN 1400
BLAKE
JAMES
2.空值不能被索引。雖然在某列上建立了索引,但是對該列的空值查詢來說,因為空白值沒有被索引,所以不能改善查詢的效率。例如下面的查詢不能利用在MGR列上建立的索引。
SQL>select ename from emp where mgr is null;
ENAME
----------
KING
另外正是因為空白值不被索引,所以可在含有空值的列上建立唯一性索引(UNIQUE INDEX)。例如,可以在EMP表的COMM列上建立唯一性索引:
SQL> create unique index emp_comm on emp(comm);
Index created.