NULL值的概念是造成SQL的新手的混淆的普遍原因,他們經常認為NULL是和一個空字符串''的一樣的東西。不是這樣的!例如,下列語句是完全不同的:
| mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (""); |
兩個語句把值插入到phone列,但是第一個插入一個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'也可以在某些情形下使用。
當使用ORDER BY時,首先呈現NULL值。如果你用DESC以降序排序,NULL值最后顯示。當使用GROUP BY時,所有的NULL值被認為是相等的。
為了有助于NULL的處理,你能使用IS NULL和IS NOT NULL運算符和IFNULL()函數。
MySQL的 IFNULL() 函數和Oracle的 NVL() 函數功能類似。以下簡單舉例:
IFNULL(expr1, expr2)
如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個數字或字符串值,取決于它被使用的上下文環境。
| mysql> select IFNULL(1,0); -> 1 mysql> select IFNULL(0,10); -> 0 mysql> select IFNULL(1/0,10); -> 10 mysql> select IFNULL(1/0,'yes'); -> 'yes' NVL( string1, replace_with) |
功能:如果string1為NULL,則NVL函數返回replace_with的值,否則返回string1的值。
引申一下,此NVL的作用與SQLserver 中的 ISNULL( string1, replace_with) 一樣。
注意事項:string1和replace_with必須為同一數據類型,除非顯式的使用TO_CHAR函數。
例:
| NVL(TO_CHAR(numeric_column), 'some string') |