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
的值。