NULL
值的概念是 SQL 新手常見的困惑來源,他們經常認為 NULL
與空字串 ''
相同。事實並非如此。例如,以下陳述式完全不同
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');
這兩個陳述式都會在 phone
欄位中插入值,但第一個插入的是 NULL
值,第二個插入的是空字串。第一個的意義可以被認為是「電話號碼未知」,第二個的意義可以被認為是「已知此人沒有電話,因此沒有電話號碼。」
為了協助處理 NULL
,您可以使用 IS NULL
和 IS NOT NULL
運算子以及 IFNULL()
函數。
在 SQL 中,NULL
值在與任何其他值(甚至是 NULL
)比較時永遠不會為真。除非運算子和函數的文件中另有說明,否則包含 NULL
的表達式總是會產生 NULL
值。以下範例中的所有欄位都會傳回 NULL
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
要搜尋值為 NULL
的欄位,您不能使用 expr = 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 = '';
請參閱 第 5.3.4.6 節「使用 NULL 值」,以取得其他資訊和範例。
如果您使用 MyISAM
、InnoDB
或 MEMORY
儲存引擎,則可以在可以有 NULL
值的欄位上新增索引。否則,您必須將索引欄位宣告為 NOT NULL
,並且無法將 NULL
插入該欄位。
當使用 LOAD DATA
讀取資料時,空或遺失的欄位會以 ''
更新。若要將 NULL
值載入欄位,請在資料檔案中使用 \N
。在某些情況下,也可以使用文字 NULL
。請參閱 第 15.2.9 節「LOAD DATA 陳述式」。
當使用 DISTINCT
、GROUP BY
或 ORDER BY
時,所有 NULL
值都被視為相等。
當使用 ORDER BY
時,NULL
值會先顯示,如果您指定 DESC
以降序排序,則會最後顯示。
彙總(群組)函數,例如 COUNT()
、MIN()
和 SUM()
會忽略 NULL
值。但 COUNT(*)
除外,它會計算列數而不是個別的欄位值。例如,以下陳述式會產生兩個計數。第一個是表格中的列數計數,第二個是 age
欄位中非 NULL
值的計數
mysql> SELECT COUNT(*), COUNT(age) FROM person;
對於某些資料類型,MySQL 會以特殊方式處理 NULL
值。例如,如果您將 NULL
插入具有 AUTO_INCREMENT
屬性的整數或浮點數欄位中,則會插入序列中的下一個數字。在某些情況下,如果您將 NULL
插入 TIMESTAMP
欄位中,則會插入目前的日期和時間;此行為部分取決於伺服器 SQL 模式 (請參閱 第 7.1.11 節「伺服器 SQL 模式」) 以及 explicit_defaults_for_timestamp
系統變數的值。