1. 程式人生 > >MySQ學習筆記之十 NULL值處理

MySQ學習筆記之十 NULL值處理

con pop -a 能夠 第一個 ips ng- 索引 one

這是MySQL一大特殊之處。

概念上。NULL意味著“沒有值”或“未知值”,且它被看作有點與眾不同的值。

為了測試NULL。你不能使用算術比較運算符比如=、<或!=。為了說明它,試試下列查詢:
mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
非常清楚你從這些比較中得到毫無意義的結果。

相反使用IS NULL和IS NOT NULL操作符:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
在MySQL中。0意味著假而1意味著真。
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 | 1+NULL | CONCAT(‘Invisible‘,NULL) |
+------+--------+--------------------------+
| NULL | NULL | 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 = "";

TIPS:
在MySQL中,就像非常多其它的SQLserver一樣,你不能索引能夠有NULL值的列。你必須聲明這種列為NOT NULL,並且,你不能插入NULL到索引的列中。


當使用ORDER BY時。首先呈現NULL值。假設你用DESC以降序排序,NULL值最後顯示。當使用GROUP BY時。全部的NULL值被覺得是相等的。
為了有助於NULL的處理,你能使用IS NULL和IS NOT NULL運算符和IFNULL()函數。


對某些列類型,NULL值被特殊地處理。假設你將NULL插入表的第一個TIMESTAMP列,則插入當前的日期和時間。

假設你將NULL插入一個AUTO_INCREMENT列,則插入順序中的下一個數字。


MySQ學習筆記之十 NULL值處理