往往很多人都認為空值與空白或0值是一樣的,至少我在今天以前是這么認為的,其實空值并不與空白和0值是一回事。 Null值表示數值未知。沒有兩個相等的空值,比較兩個空值或空值和任意一個數比較返回的均是未知。 下面有以下從SQL 聯機叢書中的關于空值的信息
往往很多人都認為空值與空白或0值是一樣的,至少我在今天以前是這么認為的,其實空值并不與空白和0值是一回事。
Null值表示數值未知。沒有兩個相等的空值,比較兩個空值或空值和任意一個數比較返回的均是未知。
下面有以下從SQL 聯機叢書中的關于空值的信息:
如下數據庫截圖所示:
空值顯示為 (null),而左下角則是空白,空白不代表沒有數據,它是插入了空格數據而產生的。
又比如,下列語句是完全不同的:
mysql> INSERT INTO table (name) VALUES (NULL); mysql> INSERT INTO table (name) VALUES ("");
兩個語句把值插入到name列,但是第一個插入一個NULL值而第二個插入一個空字符串。第一個的含義可以認為是“名字不知道”,而第二個則可意味著“他沒有沒有”。
在SQL中,NULL值在于任何其他值甚至NULL值比較時總是假的(FALSE)。包含NULL的一個表達式總是產生一個NULL值,除非在包含在表達式中的運算符和函數的文檔中指出。在下列例子,所有的列返回NULL:
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
如果你想要尋找值是NULL的列,你不能使用=NULL測試。下列語句不返回任何行,因為對任何表達式,expr = NULL是假的:
mysql> SELECT * FROM my_table WHERE phone = NULL;
要想尋找NULL值,你必須使用IS NULL測試。下例顯示如何找出NULL電話號碼和空的電話號碼:
mysql> SELECT * FROM my_table WHERE phone IS NULL; mysql> SELECT * FROM my_table WHERE phone = "";
在MySQL中,就像很多其他的SQL服務器一樣,你不能索引可以有NULL值的列。你必須聲明這樣的列為NOT NULL,而且,你不能插入NULL到索引的列中。
當用LOAD DATA INFILE讀取數據時,空列用''更新。如果你想要在一個列中有NULL值,你應該在文本文件中使用N。字面上的詞'NULL'也可以在某些情形下使用。見7.16 LOAD DATA INFILE句法。
當使用ORDER BY時,首先呈現NULL值。如果你用DESC以降序排序,NULL值最后顯示。當使用GROUP BY時,所有的NULL值被認為是相等的。
為了有助于NULL的處理,你能使用IS NULL和IS NOT NULL運算符和IFNULL()函數。
對某些列類型,NULL值被特殊地處理。如果你將NULL插入表的第一個TIMESTAMP列,則插入當前的日期和時間。如果你將NULL插入一個AUTO_INCREMENT列,則插入順序中的下一個數字。
在《SQL-3參考大全》中,作者這樣解釋NULL的含義:未知或未定義。對NULL來說,有很多有趣的特性。
NULL是一個數據值,而且它屬于一個域(?)。是的,例如一個字符串字段,其中的空值只能是一個字符串。盡管它的內容沒有定義,或者未知,但它是字符串,這一點無可置疑。
NULL不是非法數據,這一點SQL-3 標準也說的很清楚。我們沒有辦法保存零分之一,但可以保存空值。雖然它是空值,是未定義,是未知,可它也的確是一個合法的信息。
運算黑洞:對于NULL,一般的運算都會返回NULL。比如加減乘除,這簡直就是一個黑洞一樣。永遠不會有什么數據等于NULL。當然,1不等于NULL,2也一樣。可是,NULL也不等于NULL。說一個NULL等于NULL是錯誤的。所以我們只能比較它“是”或“不是”。為了避免混亂,SQL-3標準有一些約定。比如表達式 x=NULL,結果應當是UNKOWN 。 而表達式“x is NULL”,就得看情況,如果x是NULL或 False,就返回Ture(?);x是非NULL,返回False。有點奇怪是不是,它基于NULL不等于NULL。 這個規則的確為SQL標準所支持,遇到這樣的數據庫系統,可不要感到驚訝。
三值邏輯:《鹿鼎記》中的韋小寶,整人的秘訣之一就是“我問你話,是就點頭,不是就搖頭,不許你出聲!”的確,通常我們的邏輯觀點,總是基于這種二值邏輯體系,對就是對,錯就是錯。可在關系理論中,沒有這么簡單。有一種沒有絕對是非的情況存在:NULL。這就是關系理論的三值邏輯。
還有一些常見的與NULL相關的情況。比如,統計函數(也有的文檔稱之為聚集函數、集函數)通常會忽略NULL。不過,假設有這樣一個表T:
C ----- 1 2 NULL NULL
我們分別執行兩個查詢:SELECT COUNT(*) FROM T和SELECT COUNT(C) FROM T, 猜猜會有什么不同?起初,我以為兩個結果應當一樣。結果,前一個是4,后一個是2。前一個等于4,顯然基于NULL也是數據這個事實;而后一個結果為2,是由于統計C列時,COUNT忽略了NULL。
SQL-3標準中,搜索條件(WHERE和HAVING)只接受TRUE,而約束卻只拒絕FALSE,二者對NULL的接受態度相反。所以我們前面見到的ROOMS表才可以把空值寫入人員字段。而在排序時,卻又沒什么規律。SQL標準只作出了一個補充定義,所以每個DBMS的處理 ORDER BY的方法并不相同,當然NULL不是高于所有值就是低于所有值。
在《SQL-3參考大全》中介紹了更詳細的關于NULL的內容。另外,書中還介紹了兩位數據庫專家C.J.Date和E.f.Codd關于NULL的不同論點(E.F.Codd甚至希望有四值邏輯)有興趣的朋友可以找來一讀。在實踐中,我們還會遇到一些有趣的事,特別是聯接查詢中, NULL讓我們的人生變得 “豐富多彩”。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com