文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


B.3.4.3 NULL 值問題

NULL 值的概念是 SQL 新手常見的困惑來源,他們經常認為 NULL 與空字串 '' 相同。事實並非如此。例如,以下陳述式完全不同

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');

這兩個陳述式都會在 phone 欄位中插入值,但第一個插入的是 NULL 值,第二個插入的是空字串。第一個的意義可以被認為是電話號碼未知,第二個的意義可以被認為是已知此人沒有電話,因此沒有電話號碼。

為了協助處理 NULL,您可以使用 IS NULLIS 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 值」,以取得其他資訊和範例。

如果您使用 MyISAMInnoDBMEMORY 儲存引擎,則可以在可以有 NULL 值的欄位上新增索引。否則,您必須將索引欄位宣告為 NOT NULL,並且無法將 NULL 插入該欄位。

當使用 LOAD DATA 讀取資料時,空或遺失的欄位會以 '' 更新。若要將 NULL 值載入欄位,請在資料檔案中使用 \N。在某些情況下,也可以使用文字 NULL。請參閱 第 15.2.9 節「LOAD DATA 陳述式」

當使用 DISTINCTGROUP BYORDER 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 系統變數的值。