MySQL NULL詳細和應用

2019-10-16 22:57:06

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

如果不能理解和使用資料庫中NULL值,那麼可以認為您的資料庫學習最多算剛入門水平。

MySQL NULL值簡介

在MySQL中,NULL值表示一個未知值。 NULL值不同於0或空字串''

NULL值不等於它自身。如果將NULL值與另一個NULL值或任何其他值進行比較,則結果為NULL,因為一個不知道是什麼的值(NULL值)與另一個不知道是什麼的值(NULL值)比較,其值當然也是一個不知道是什麼的值(NULL值)。

通常,使用NULL值來表示資料丟失,未知或不適用的情況。 例如,潛在客戶的電話號碼可能為NULL,並且可以稍後新增。

建立表時,可以通過使用NOT NULL約束來指定列是否接受NULL值。

例如,以下語句用於建立一張leads表:

USE testdb;
CREATE TABLE leads (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    source VARCHAR(255) NOT NULL,
    email VARCHAR(100),
    phone VARCHAR(25)
);

因此,id主鍵列,它不接受任何NULL值。

first_namelast_namesource列使用NOT NULL約束,因此,不能在這些列中插入任何NULL值,而emailphone列則可接受NULL值。

您可以在INSERT語句中使用NULL值來指定資料丟失。 例如,以下語句將一行插入到線索表中。 因為電話號碼丟失,所以使用NULL值。

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('John','Doe','Web Search','[email protected]',NULL);

因為email列的預設值為NULL,可以按照以下方式在INSERT語句中省略電子郵件:

INSERT INTO leads(first_name,last_name,source,phone)
VALUES('Lily','Bush','Cold Calling','(408)-555-1234'),
('David','William','Web Search','(408)-888-6789');

UPDATE語句中的MySQL SET NULL值

要將列的值設定為NULL,可以使用賦值運算子(=)。 例如,要將David William的手機(phone)更新為NULL,請使用以下UPDATE語句:

UPDATE leads 
SET 
    phone = NULL
WHERE
    id = 3;

MySQL ORDER BY為NULL

如果使用ORDER BY子句按升序對結果集進行排序,則MySQL認為NULL值低於其他值,因此,它會首先顯示NULL值。

以下查詢語句按照電話號碼(phone)升序排列。如下所示 -

SELECT 
    *
FROM
    leads
ORDER BY phone;

執行上面查詢語句,結果如下 -

+----+------------+-----------+--------------+---------------------+----------------+
| id | first_name | last_name | source       | email               | phone          |
+----+------------+-----------+--------------+---------------------+----------------+
|  1 | John       | Doe       | Web Search   | [email protected] | NULL           |
|  3 | David      | William   | Web Search   | NULL                | NULL           |
|  2 | Lily       | Bush      | Cold Calling | NULL                | (408)-555-1234 |
+----+------------+-----------+--------------+---------------------+----------------+

如果使用ORDER BY DESCNULL值將顯示在結果集的最後。 請參閱以下範例:

SELECT 
    *
FROM
    leads
ORDER BY phone DESC;

執行上面查詢語句,結果如下 -

+----+------------+-----------+--------------+---------------------+----------------+
| id | first_name | last_name | source       | email               | phone          |
+----+------------+-----------+--------------+---------------------+----------------+
|  2 | Lily       | Bush      | Cold Calling | NULL                | (408)-555-1234 |
|  1 | John       | Doe       | Web Search   | [email protected] | NULL           |
|  3 | David      | William   | Web Search   | NULL                | NULL           |
+----+------------+-----------+--------------+---------------------+----------------+
3 rows in set

要在查詢中測試NULL,可以在WHERE子句中使用IS NULLIS NOT NULL運算子。

例如,要獲得尚未提供電話號碼的潛在客戶,請使用IS NULL運算子,如下所示:

SELECT 
    *
FROM
    leads
WHERE
    phone IS NULL;

執行上面查詢語句,結果如下 -

+----+------------+-----------+------------+---------------------+-------+
| id | first_name | last_name | source     | email               | phone |
+----+------------+-----------+------------+---------------------+-------+
|  1 | John       | Doe       | Web Search | [email protected] | NULL  |
|  3 | David      | William   | Web Search | NULL                | NULL  |
+----+------------+-----------+------------+---------------------+-------+
2 rows in set

可以使用IS NOT運算子來獲取所有提供電子郵件地址的潛在客戶。

SELECT 
    *
FROM
    leads
WHERE
    email IS NOT NULL;

執行上面查詢語句,結果如下 -

+----+------------+-----------+------------+---------------------+-------+
| id | first_name | last_name | source     | email               | phone |
+----+------------+-----------+------------+---------------------+-------+
|  1 | John       | Doe       | Web Search | [email protected] | NULL  |
+----+------------+-----------+------------+---------------------+-------+
1 row in set

即使NULL不等於NULLGROUP BY子句中視兩個NULL值相等。

SELECT 
    email, count(*)
FROM
    leads
GROUP BY email;

該查詢只返回兩行,因為其郵箱(email)列為NULL的行被分組為一行,結果如下所示 -

+---------------------+----------+
| email               | count(*) |
+---------------------+----------+
| NULL                |        2 |
| [email protected] |        1 |
+---------------------+----------+
2 rows in set

MySQL NULL和UNIQUE索引

在列上使用唯一約束或UNIQUE索引時,可以在該列中插入多個NULL值。這是非常好的,因為在這種情況下,MySQL認為NULL值是不同的。

我們通過為phone列建立一個UNIQUE索引來驗證這一點。

CREATE UNIQUE INDEX idx_phone ON leads(phone);

請注意,如果使用BDB儲存引擎,MySQL認為NULL值相等,因此您不能將多個NULL值插入到具有唯一約束的列中。

MySQL NULL函式

MySQL提供了幾個有用的功能,很好地處理空值:IFNULLCOALESCENULLIF

IFNULL函式接受兩個引數。 如果IFNULL函式不為NULL,則返回第一個引數,否則返回第二個引數。

例如,如果不是NULL,則以下語句返回電話號碼(phone),否則返回N/A,而不是NULL

SELECT 
    id, first_name, last_name, IFNULL(phone, 'N/A') phone
FROM
    leads;

執行上面查詢語句,得到以下結果 -

+----+------------+-----------+----------------+
| id | first_name | last_name | phone          |
+----+------------+-----------+----------------+
|  1 | John       | Doe       | N/A            |
|  2 | Lily       | Bush      | (408)-555-1234 |
|  3 | David      | William   | N/A            |
+----+------------+-----------+----------------+
3 rows in set

COALESCE函式接受引數列表,並返回第一個非NULL引數。 例如,可以使用COALESCE函式根據資訊的優先順序按照以下順序顯示線索的聯絡資訊:phone, emailN/A

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

執行上面查詢語句,得到以下程式碼 -

+----+------------+-----------+---------------------+
| id | first_name | last_name | contact             |
+----+------------+-----------+---------------------+
|  1 | John       | Doe       | [email protected] |
|  2 | Lily       | Bush      | (408)-555-1234      |
|  3 | David      | William   | N/A                 |
+----+------------+-----------+---------------------+
3 rows in set

NULLIF函式接受兩個引數。如果兩個引數相等,則NULLIF函式返回NULL。 否則,它返回第一個引數。

在列中同時具有NULL和空字串值時,NULLIF函式很有用。 例如,錯誤地,您將以下行插入到leads表中:

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('Thierry','Henry','Web Search','[email protected]','');

phone是一個空字串:'',而不是NULL

如果您想獲得潛在客戶的聯絡資訊,則最終得到空phone,而不是電子郵件,如下所示:

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

執行上面查詢語句,得到以下程式碼 -

+----+------------+-----------+---------------------+
| id | first_name | last_name | contact             |
+----+------------+-----------+---------------------+
|  1 | John       | Doe       | [email protected] |
|  2 | Lily       | Bush      | (408)-555-1234      |
|  3 | David      | William   | N/A                 |
|  4 | Thierry    | Henry     |                     |
+----+------------+-----------+---------------------+

要解決這個問題,您可以使用NULLIF函式將電話與空字串('')進行比較,如果相等,則返回NULL,否則返回電話號碼。

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(NULLIF(phone, ''), email, 'N/A') contact
FROM
    leads;

執行上面查詢語句,得到以下程式碼 -

+----+------------+-----------+--------------------------+
| id | first_name | last_name | contact                  |
+----+------------+-----------+--------------------------+
|  1 | John       | Doe       | [email protected]      |
|  2 | Lily       | Bush      | (408)-555-1234           |
|  3 | David      | William   | N/A                      |
|  4 | Thierry    | Henry     | [email protected] |
+----+------------+-----------+--------------------------+
4 rows in set

在本教學中,您已經學習了如何使用MySQL NULL值,以及如何使用一些方便的函式來處理查詢中的NULL