MySQL NULL的理解和應用

在本教程中,您將學習如何使用MySQL NULL值。 此外,您將學習一些有用的函數來有效地處理NULL值。html

MySQL NULL值簡介

在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_namesource列使用NOT NULL約束,所以,不能在這些列中插入NULL值。htm

emailphone列是能夠接受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');

接下來查詢表中的數據,結果以下所示-索引

在UPDATE語句中使用MySQL SET NULL

要將列的值設置爲NULL,請使用賦值運算符(=)。 例如,要將王小丫的電話更新爲NULL,請使用如下UPDATE語句:

UPDATE leads 
SET 
    phone = NULL
WHERE
    id = 2;

MySQL ORDER BY NULL

若是使用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 NULLIS 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的行被分組爲一行。

MySQL NULL和UNIQUE索引

在列上使用惟一約束或UNIQUE索引時,能夠向該列插入多個NULL值。 這是徹底正常的,由於在這種狀況下MySQL認爲NULL值是不一樣的。 讓咱們經過在phone列上添加一個UNIQUE索引來驗證這一點。

CREATE UNIQUE INDEX idx_phone ON leads(phone);

注意,若是使用BDB存儲引擎,MySQL認爲NULL值相等的,所以不能在具備惟一約束的列中插入多個NULL值。

MySQL NULL函數

MySQL提供了幾個有用的函數來處理NULL值:ISNULLCOALESCENULLIFISNULL函數接受兩個參數。 若是它不爲NULLIFNULL函數返回第一個參數,不然返回第二個參數。

例如,如下語句顯示電話號碼,若是暫時不清楚則顯示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值。

相關文章
相關標籤/搜索