Oracle資料庫 Null值 總結
阿新 • • 發佈:2019-01-22
有人總結了資料庫中Null值的概念,比較精煉,摘錄如下:
Null是資料庫中特有的資料型別,當一條記錄的某個列為Null,則表示這個列的值是未知的、是不確定的。既然是未知的,就有無數種的可能性。因此,Null並不是一個確定的值。
這是Null的由來、也是Null的基礎,所有和Null相關的操作的結果都可以從Null的概念推匯出來。
判斷一個欄位是否為Null, 應該用IS Null或IS NOT Null,而不能用‘=’。對Null的判斷只能定性,既是不是Null(IS Null/IS NOT Null),而不能定值。簡單的說,由於Null存在著無數的可能,因此兩個Null不是相等的關係,同樣也不能說兩個Null就不相等,或者比較兩個 Null的大小,這些操作都是沒有意義,得不到一個確切的答案的。因此,對Null的=、!=、>、<、>=、<=等操作的結果 都是未知的,也就算說,這些操作的結果仍然是Null。
同理,對Null進行+、-、*、/等操作的結果也是未知的,所以也是Null。
所以,很多時候會這樣總結Null,除了IS Null、IS NOT Null以外,對Null的任何操作的結果還是Null。
Oracle 中的Null值和SQL Server 中的差不多,但是有個明顯的區別,在Oracle中空字串(‘’)被視作Null值。ORACLE允許任何一種資料型別的欄位為Null,除了以下兩種情況:
1. 主鍵欄位(primary key);
2. 定義時已經加了NOT Null限制條件的欄位
說了這麼多,我們來看一些例子。
1. Null 比較
SQL> select 1 from dual where Null=Null;
-------------------------------------------------------------------------------
沒有查到記錄
SQL> select 1 from dual where Null='';
-------------------------------------------------------------------------------
沒有查到記錄
SQL>select 1 from dual where ''='';
-------------------------------------------------------------------------------
沒有查到記錄
SQL> select 1 from dual where Null is Null;
-------------------------------------------------------------------------------
1
SQL>select 1 from dual where '' is Null;
-------------------------------------------------------------------------------
1
SQL> select 1 from dual where nvl(Null,0)=nvl(Null,0);
-------------------------------------------------------------------------------
1
2. Null 值運算
對空值做加、減、乘、除等運算操作,結果仍為Null。如下面的例子
SQL> select 1+Null from dual;
SQL> select 1-Null from dual;
SQL> select 1*Null from dual;
SQL> select 1/Null from dual;
查詢到一個記錄。這個記錄就是SQL語句中的那個Null
3. Trim 陷阱
習慣寫T-SQL 程式碼的人員,容易寫出下面的錯誤程式碼:
IF v_month IS Null OR TRIM (v_month) = ''
THEN
;
END IF;
如果v_month 是空格串, trim後會得到Null值。
SQL>select 1 from dual where trim(' ')='';
-------------------------------------------------------------------------------
沒有查到記錄
SQL> select 1 from dual where trim(' ') is Null;
-------------------------------------------------------------------------------
1
4. 查詢中的Null值陷阱
建立下列測試表和資料:
create table cassba_Null
(
column1 varchar2(300) not Null,
column2 varchar2(300) Null
);
insert into cassba_Null values('1','1');
insert into cassba_Null values('2','');
commit;
共輸入2條記錄,注意第2筆記錄的 column2值為Null
進行查詢:
SQL> select * from cassba_Null where column2 like '%';
查詢到1條記錄.
結果說明:
查詢結果說明此SQL語句查詢不出列值為Null的欄位,此時需對欄位為Null的情況另外處理。
SQL> select * from cassba_Null where column2 like '%' or column2 is Null;
SQL> select * from cassba_Null where nvl(column2, '0') like '%';
查詢到2筆記錄。
5. Oracle 中處理Null值的函式: NVL()
語法
NVL(eExpression1, eExpression2)
引數
eExpression1, eExpression2
如果 eExpression1 的計算結果為 Null 值,則 NVL() 返回 eExpression2。如果 eExpression1 的計算結果不是 Null 值,則返回 eExpression1。eExpression1 和 eExpression2 可以是任意一種資料型別。如果 eExpression1 與 eExpression2 的結果皆為 Null 值,則 NVL( ) 返回 Null
返回值型別
字元型、日期型、日期時間型、數值型、貨幣型、邏輯型或 Null 值
說明
在不支援 Null 值或 Null 值無關緊要的情況下,可以使用 NVL( ) 來移去計算或操作中的 Null 值。
6. 總結與其它
1) Null等價於沒有任何值、是未知數;
2) 對Null做加、減、乘、除等運算操作,結果仍為Null;
3) Null的處理使用NVL函式 ;
4) 比較時使用關鍵字用 is Null和is not Null;
5) Null不能被索引,所以查詢時有些符合條件的資料可能查不出來,count(?)中,用nvl(列名,0)處理後再查;
6) 排序時比其他資料都大(索引預設是升序(ASC)排列,小→大),所以Null值總是排在最後。
7) Oracle 中空字串等同於Null值,注意Trim空格串後引起的Null值
Null是資料庫中特有的資料型別,當一條記錄的某個列為Null,則表示這個列的值是未知的、是不確定的。既然是未知的,就有無數種的可能性。因此,Null並不是一個確定的值。
這是Null的由來、也是Null的基礎,所有和Null相關的操作的結果都可以從Null的概念推匯出來。
判斷一個欄位是否為Null, 應該用IS Null或IS NOT Null,而不能用‘=’。對Null的判斷只能定性,既是不是Null(IS Null/IS NOT Null),而不能定值。簡單的說,由於Null存在著無數的可能,因此兩個Null不是相等的關係,同樣也不能說兩個Null就不相等,或者比較兩個 Null的大小,這些操作都是沒有意義,得不到一個確切的答案的。因此,對Null的=、!=、>、<、>=、<=等操作的結果 都是未知的,也就算說,這些操作的結果仍然是Null。
同理,對Null進行+、-、*、/等操作的結果也是未知的,所以也是Null。
所以,很多時候會這樣總結Null,除了IS Null、IS NOT Null以外,對Null的任何操作的結果還是Null。
Oracle 中的Null值和SQL Server 中的差不多,但是有個明顯的區別,在Oracle中空字串(‘’)被視作Null值。ORACLE允許任何一種資料型別的欄位為Null,除了以下兩種情況:
1. 主鍵欄位(primary key);
2. 定義時已經加了NOT Null限制條件的欄位
說了這麼多,我們來看一些例子。
1. Null 比較
SQL> select 1 from dual where Null=Null;
-------------------------------------------------------------------------------
沒有查到記錄
SQL> select 1 from dual where Null='';
-------------------------------------------------------------------------------
沒有查到記錄
SQL>select 1 from dual where ''='';
-------------------------------------------------------------------------------
沒有查到記錄
SQL> select 1 from dual where Null is Null;
-------------------------------------------------------------------------------
1
SQL>select 1 from dual where '' is Null;
-------------------------------------------------------------------------------
1
SQL> select 1 from dual where nvl(Null,0)=nvl(Null,0);
-------------------------------------------------------------------------------
1
2. Null 值運算
對空值做加、減、乘、除等運算操作,結果仍為Null。如下面的例子
SQL> select 1+Null from dual;
SQL> select 1-Null from dual;
SQL> select 1*Null from dual;
SQL> select 1/Null from dual;
查詢到一個記錄。這個記錄就是SQL語句中的那個Null
3. Trim 陷阱
習慣寫T-SQL 程式碼的人員,容易寫出下面的錯誤程式碼:
IF v_month IS Null OR TRIM (v_month) = ''
THEN
;
END IF;
如果v_month 是空格串, trim後會得到Null值。
SQL>select 1 from dual where trim(' ')='';
-------------------------------------------------------------------------------
沒有查到記錄
SQL> select 1 from dual where trim(' ') is Null;
-------------------------------------------------------------------------------
1
4. 查詢中的Null值陷阱
建立下列測試表和資料:
create table cassba_Null
(
column1 varchar2(300) not Null,
column2 varchar2(300) Null
);
insert into cassba_Null values('1','1');
insert into cassba_Null values('2','');
commit;
共輸入2條記錄,注意第2筆記錄的 column2值為Null
進行查詢:
SQL> select * from cassba_Null where column2 like '%';
查詢到1條記錄.
結果說明:
查詢結果說明此SQL語句查詢不出列值為Null的欄位,此時需對欄位為Null的情況另外處理。
SQL> select * from cassba_Null where column2 like '%' or column2 is Null;
SQL> select * from cassba_Null where nvl(column2, '0') like '%';
查詢到2筆記錄。
5. Oracle 中處理Null值的函式: NVL()
語法
NVL(eExpression1, eExpression2)
引數
eExpression1, eExpression2
如果 eExpression1 的計算結果為 Null 值,則 NVL() 返回 eExpression2。如果 eExpression1 的計算結果不是 Null 值,則返回 eExpression1。eExpression1 和 eExpression2 可以是任意一種資料型別。如果 eExpression1 與 eExpression2 的結果皆為 Null 值,則 NVL( ) 返回 Null
返回值型別
字元型、日期型、日期時間型、數值型、貨幣型、邏輯型或 Null 值
說明
在不支援 Null 值或 Null 值無關緊要的情況下,可以使用 NVL( ) 來移去計算或操作中的 Null 值。
6. 總結與其它
1) Null等價於沒有任何值、是未知數;
2) 對Null做加、減、乘、除等運算操作,結果仍為Null;
3) Null的處理使用NVL函式 ;
4) 比較時使用關鍵字用 is Null和is not Null;
5) Null不能被索引,所以查詢時有些符合條件的資料可能查不出來,count(?)中,用nvl(列名,0)處理後再查;
6) 排序時比其他資料都大(索引預設是升序(ASC)排列,小→大),所以Null值總是排在最後。
7) Oracle 中空字串等同於Null值,注意Trim空格串後引起的Null值