在本教學中,您將學習如何使用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_name
,last_name
和source
列使用NOT NULL
約束,因此,不能在這些列中插入任何NULL
值,而email
和phone
列則可接受NULL
值。
您可以在INSERT語句中使用NULL
值來指定數據丟失。 例如,以下語句將一行插入到線索表中。 因為電話號碼丟失,所以使用NULL
值。
INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('John','Doe','Web Search','john.doe@xuhuhu.com',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 | john.doe@xuhuhu.com | NULL |
| 3 | David | William | Web Search | NULL | NULL |
| 2 | Lily | Bush | Cold Calling | NULL | (408)-555-1234 |
+----+------------+-----------+--------------+---------------------+----------------+
如果使用ORDER BY DESC
,NULL
值將顯示在結果集的最後。 請參閱以下示例:
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 | john.doe@xuhuhu.com | NULL |
| 3 | David | William | Web Search | NULL | NULL |
+----+------------+-----------+--------------+---------------------+----------------+
3 rows in set
要在查詢中測試NULL
,可以在WHERE子句中使用IS NULL
或IS NOT NULL
運算符。
例如,要獲得尚未提供電話號碼的潛在客戶,請使用IS NULL
運算符,如下所示:
SELECT
*
FROM
leads
WHERE
phone IS NULL;
執行上面查詢語句,結果如下 -
+----+------------+-----------+------------+---------------------+-------+
| id | first_name | last_name | source | email | phone |
+----+------------+-----------+------------+---------------------+-------+
| 1 | John | Doe | Web Search | john.doe@xuhuhu.com | 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 | john.doe@xuhuhu.com | NULL |
+----+------------+-----------+------------+---------------------+-------+
1 row in set
即使NULL
不等於NULL
,GROUP BY
子句中視兩個NULL
值相等。
SELECT
email, count(*)
FROM
leads
GROUP BY email;
該查詢只返回兩行,因為其郵箱(email
)列為NULL
的行被分組為一行,結果如下所示 -
+---------------------+----------+
| email | count(*) |
+---------------------+----------+
| NULL | 2 |
| john.doe@xuhuhu.com | 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提供了幾個有用的功能,很好地處理空值:IFNULL,COALESCE和NULLIF。
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
, email
和N/A
。
SELECT
id,
first_name,
last_name,
COALESCE(phone, email, 'N/A') contact
FROM
leads;
執行上面查詢語句,得到以下代碼 -
+----+------------+-----------+---------------------+
| id | first_name | last_name | contact |
+----+------------+-----------+---------------------+
| 1 | John | Doe | john.doe@xuhuhu.com |
| 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','thierry.henry@xuhuhu.com','');
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 | john.doe@xuhuhu.com |
| 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 | john.doe@xuhuhu.com |
| 2 | Lily | Bush | (408)-555-1234 |
| 3 | David | William | N/A |
| 4 | Thierry | Henry | thierry.henry@xuhuhu.com |
+----+------------+-----------+--------------------------+
4 rows in set
在本教學中,您已經學習了如何使用MySQL NULL
值,以及如何使用一些方便的函數來處理查詢中的NULL
。