在本教程中,您將學習如何使用MySQL NULL
值。 此外,您將學習一些有用的函數來有效地處理NULL
值。html
在MySQL中,NULL
值意味着未知值。 NULL
值不是零或空字符''值。 NULL
值不等於其自身值。 若是將NULL
值與另外一個NULL
值或任何其餘值進行比較,則結果爲NULL
,由於每一個NULL
值的值都是未知的。mysql
一般,使用NULL
值來表示數據丟失,未知或不適用。 例如,當客戶的電話號碼可設置爲NULL
,而且能夠稍後添加。sql
當建立表時,能夠經過使用NOT NULL
約束來指定列是否接受NULL
值。函數
例如,如下語句建立leads
表:學習
CREATE TABLE studymysql.leads ( id INT AUTO_INCREMENT PRIMARY KEY, customer_name VARCHAR(50) NOT NULL, source VARCHAR(255) NOT NULL, email VARCHAR(100), phone VARCHAR(25) );
所以,id是主鍵列,所以它不接受任何NULL
值。code
customer_name
和source
列使用NOT NULL
約束,所以,不能在這些列中插入NULL
值。htm
email
和phone
列是能夠接受NULL
值的。 您能夠在INSERT
語句中使用NULL
值來指定缺乏數據。例如,如下語句在leads
表中插入一行。由於客戶的電話號碼丟失,所以這裏使用了NULL
值。排序
INSERT INTO leads(customer_name,source,email,phone) VALUE('蘇小魯','Web Search','Xiaolu.su@studymysql.com',NULL);
因爲電子郵件列(email
)的默認值爲NULL
,所以能夠在INSERT
語句中省略電子郵件的值,以下所示:教程
INSERT INTO leads(customer_name,source,phone) VALUES('王小丫','Cold Calling','13800138000'), ('王力宏','Web Search','13800138001');
接下來查詢表中的數據,結果以下所示-索引
要將列的值設置爲NULL
,請使用賦值運算符(=)。 例如,要將王小丫
的電話更新爲NULL
,請使用如下UPDATE語句:
UPDATE leads SET phone = NULL WHERE id = 2;
若是使用ORDER BY子句以升序對結果集排序,MySQL認爲NULL
值低於其餘值,所以,它首先顯示NULL
值。
如下語句按電話號碼(phone
)升序排列 leads 表中的數據。
SELECT * FROM leads ORDER BY phone;
執行上面的查詢語句後,結果以下所示 -
在使用ORDER BY DESC
的狀況下,NULL
值出如今結果集的最後。 請參見如下示例:
SELECT * FROM leads ORDER BY phone DESC;
執行上面的查詢語句後,結果以下所示 -
要在查詢中找出NULL
值,請在WHERE子句中使用IS NULL
或IS NOT NULL
運算符。
例如,要獲取還沒有提供電話號碼的潛在客戶信息,請使用IS NULL
運算符,以下所示:
SELECT * FROM leads WHERE phone IS NULL;
執行上面的查詢語句後,結果以下所示 -
您可使用NOT NULL
運算符獲取有提供電子郵件地址的全部潛在客戶信息。
SELECT * FROM leads WHERE email IS NOT NULL;
執行上面的查詢語句後,結果以下所示 -
即便NULL
不等於NULL
,可是在GROUP BY
子句中的兩個NULL
值也是相等的。
SELECT id, customer_name, email, phone FROM leads GROUP BY email;
執行上面的查詢語句後,結果以下所示 -
查詢只返回兩行,由於電子郵件(email
)列爲NULL
的行被分組爲一行。
在列上使用惟一約束或UNIQUE索引時,能夠向該列插入多個NULL
值。 這是徹底正常的,由於在這種狀況下MySQL認爲NULL
值是不一樣的。 讓咱們經過在phone
列上添加一個UNIQUE
索引來驗證這一點。
CREATE UNIQUE INDEX idx_phone ON leads(phone);
注意,若是使用BDB存儲引擎,MySQL認爲
NULL
值相等的,所以不能在具備惟一約束的列中插入多個NULL
值。
MySQL提供了幾個有用的函數來處理NULL
值:ISNULL,COALESCE
和NULLIF
。 ISNULL
函數接受兩個參數。 若是它不爲NULL
,IFNULL
函數返回第一個參數,不然返回第二個參數。
例如,如下語句顯示電話號碼,若是暫時不清楚則顯示N/A
,而不是NULL
。
SELECT id, customer_name, IFNULL(phone, 'N/A') phone FROM studymysql.leads;
執行上面的查詢語句後,結果以下所示 -
COALESCE
函數接受參數列表,並返回第一個非NULL
參數。例如,您可使用COALESCE
函數來根據信息的優先級按如下順序顯示潛在客戶的聯繫信息:phone, email, 和 N/A。
SELECT id, customer_name, COALESCE(phone, email, 'N/A') contact FROM leads;
執行上面的查詢語句後,結果以下所示 -
NULLIF
函數接受兩個參數。 若是兩個參數相等,則NULLIF
函數返回NULL
。 不然,它返回第一個參數。
當列中的值爲NULL
和空字符串時,NULLIF
函數很是有用。 例如,錯誤地在leads
表中插入如下行:
INSERT INTO leads(customer_name,source,email,phone) VALUE('蘇小擼','Web Search','xlu.su@studymysql.com','');
電話(phone
)是空字符串,而不是NULL
值。 若是您想獲取潛在客戶的聯繫信息,則最終獲得一個空的電話,而不是電子郵件,如如下查詢:
SELECT id, customer_name, COALESCE(phone, email, 'N/A') contact FROM leads;
執行上面的查詢語句後,結果以下所示 -
要解決這個問題,您可使用NULLIF
函數將電話與空字符串進行比較,若是它們相等,則返回NULL
,不然返回電話號碼。
SELECT id, customer_name, COALESCE(NULLIF(phone, ''), email, 'N/A') contact FROM leads;
執行上面的查詢語句後,結果以下所示 -
在本教程中,您已經學習瞭如何使用MySQL NULL
值以及如何使用一些方便的函數來處理查詢中的NULL
值。