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 系統變數的值。