說明:本篇文章是摘取自如下連接的Blog,但做者的這篇文章也是轉載(很是感謝),我在記錄的時候也有添加本身的思考。 sql
http://blog.csdn.net/wh62592855/article/details/4724186
函數
一、什麼是NULL? 測試
當咱們在不知道具體有什麼數據的時候,也就是數據類型不知道、長度不知道等,未知的數據時。咱們就能夠用NULL,咱們稱它爲空,ORACLE中,含有空值的表列長度爲0; spa
Oracle中容許任何一種數據類型的字段爲空,除了如下兩種狀況: .net
1)主鍵字段(primary key); code
2)定義時已經加了NOT NULL限制條件的字段; blog
說明: 排序
1)NULL等價於沒有任何值、是未知數; 索引
個人註明:感受說法有些欠妥 ,參考個人下一篇文章; 文檔
2)NULL與0、空字符串、空格都不一樣;
個人註明:與0、空格都不一樣,這很好理解;可是與空字符串不一樣,這個就讓我有些費解。在我上一篇文章中有說, 個人經歷彷佛能夠代表Oracle將插入字段值爲空字符串解析成了NULL(該字段成了NULL)。但這是否是就認爲Oracle中的NULL與空字符串相同呢?我以爲應該不能這樣認爲......
3)對空值作加、減、乘、除等運算操做,結果認爲空;
4)NULL處理用NVL函數;
5)比較時關鍵字用"IS NULL" 和 "IS NOT NULL";
6)空值不能被索引,因此查詢時有些符合條件的數據可能查不出來,COUNT(*)中,用NVL(列明,0);
個人註明:參考個人下一篇文章;
7)排序是比其餘數據都大,若是按照升序排列,NULL值老是排在最後面;
二、下面是原做者舉得一個頗有意思的例子
根據NULL的定義,NULL表示的是未知的,所以兩個NULL比較的結果既不相等,也不不等(更深層的理解能夠參見下篇文章)。根據這個定義,能夠想到多個NULL值的存在應該不違反惟一約束。實際上Oracle也是如此實現的:
在上篇文章已經創建的表中添加以下約束:
ALTER TABLE Z_TEST ADD UNIQUE(FSTUDENTID); ALTER TABLE Z_TEST ADD UNIQUE(Z_TEST.FSTUDENTID); --此條語句出錯,不能這樣寫往表裏插數據:
INSERT INTO z_test VALUES('007', '愛玲童'); --出錯,由於表中已經有了007記錄 INSERT INTO z_test VALUES(NULL, '木木'); --正確 INSERT INTO z_test VALUES(NULL, '木木'); --正確 INSERT INTO z_test VALUES(NULL, '李力'); --正確
表數據結果:
可是當惟一約束爲複合字段時,則狀況發生了變化。根據Oracle文檔的描述,對於複合字段的惟一約束,不爲空字段的值是不能重複的。也就是說,若是兩個字段構成了一個惟一約束,其中一個字段爲空,那麼另外一個字段的值不能出現重複。
ALTER TABLE Z_TEST ADD UNIQUE(FSTUDENTID, FSTUDENTNAME); INSERT INTO Z_TEST VALUES (NULL, NULL); --正確 INSERT INTO Z_TEST VALUES (NULL, NULL); --正確 INSERT INTO Z_TEST VALUES ('007', NULL); --正確 INSERT INTO Z_TEST VALUES ('007', NULL); --正確表數據結果:
我測試的結果和原做者描述的徹底不同。
按照做者的說法,我上面的最後兩條記錄,在插入時是會報錯的。做者解釋:對於所有爲NULL的狀況,仍然和單字段惟一的約束同樣,不會形成重複,可是對於部分NULL的狀況,只要其中不爲NULL的部分發生了重複,Oracle就認爲約束髮生了重複。而這彷佛和NULL的定義有所衝突。因爲Oracle的惟一約束是依賴索引實現的,而Oracle的BTREE索引又是不存儲NULL值的,因此鍵值所有爲NULL的記錄不會記錄在索引中,於是就不會違反惟一約束了,而對於部分爲NULL的記錄,索引是要記錄數值的,所以一旦鍵值中非NULL部分發生了衝突,Oracle就認爲違反了惟一約束。Oracle在這裏仍是選擇了本身方便的方法來實現,而沒有徹底真正的根據NULL的定義去實現惟一約束。
但是我測得結果就不是這樣的,個人Oracle版本是:Oracle10g~~~~~~
三、Oracle中NULL與空字符串的關聯
原做者剩餘的篇幅就是和我上篇文章差很少的,感受Oracle就是把空字符串''當作NULL在處理,但是在判斷的時候不能用='',而須要用IS NULL或者是 IS NOT NULL。
總結:在第一做者的描述中,我看到了他關於第2條相關數據的測試,多是因爲Oracle版本的不一樣,同窗們在用的時候最好仍是親自測試一下,要保持懷疑的態度。