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