mysql中null(IFNULL,COALESCE和NULLIF)相關知識點總結
本文例項講述了mysql中null(IFNULL,COALESCE和NULLIF)相關知識點。分享給大家供大家參考,具體如下:
在MySQL中,NULL值表示一個未知值,它不同於0或空字串'',並且不等於它自身。
我們如果將NULL值與另一個NULL值或任何其他值進行比較,則結果為NULL,因為一個不知道是什麼的值(NULL值)與另一個不知道是什麼的值(NULL值)比較,其值當然也是一個不知道是什麼的值(NULL值)。
然而我們通常,使用NULL值來表示資料丟失,未知或不適用的情況。 例如,潛在客戶的電話號碼可能為NULL,並且可以稍後新增。所以我們建立表時,可以通過使用NOT NULL約束來指定列是否接受NULL值。接下來,我們來建立一張leads表,並且以此為依據來具體瞭解下:
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','[email protected]',NULL);
因為email列的預設值為NULL,可以按照以下方式在INSERT語句中省略電子郵件:
INSERT INTO leads(first_name,phone) VALUES('Lily','Bush','Cold Calling','(408)-555-1234'),('David','William','(408)-888-6789');
完事如果我們要將列的值設定為NULL,可以使用賦值運算子(=)。 例如,要將David William的手機(phone)更新為NULL,請使用以下UPDATE語句:
UPDATE leads SET phone = NULL WHERE id = 3;
但是如果使用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 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 | [email protected] | 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 | [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不等於NULL,GROUP BY子句中視兩個NULL值相等,來看下sql例項:
SELECT email,count(*) FROM leads GROUP BY email;
該查詢只返回兩行,因為其郵箱(email)列為NULL的行被分組為一行,結果如下所示:
+---------------------+----------+ | email | count(*) | +---------------------+----------+ | NULL | 2 | | [email protected] | 1 | +---------------------+----------+ 2 rows in set
我們要知道在列上使用唯一約束或UNIQUE索引時,可以在該列中插入多個NULL值,在這種情況下,MySQL認為NULL值是不同的。接下來我們通過為phone列建立一個UNIQUE索引來驗證這一點:
CREATE UNIQUE INDEX idx_phone ON leads(phone);
這裡我們要注意,如果使用BDB儲存引擎的話,mysql會認為NULL值相等,因此我們不能將多個NULL值插入到具有唯一約束的列中。
既然知道了null的好處和壞處,我們就來看下在mysql中應該如何處理它吧。mysql一共提供了三個函式,分別是IFNULL,COALESCE和NULLIF。
我們來分別看下,首先,IFNULL函式接受兩個引數。 如果IFNULL函式不為NULL,則返回第一個引數,否則返回第二個引數。例如,如果不是NULL,則以下語句返回電話號碼(phone),否則返回N/A,而不是NULL。來看個例項:
SELECT id,first_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,COALESCE(phone,'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,phone) VALUE('Thierry','Henry','[email protected]','');
因為phone是一個空字串:'',而不是NULL。所以,如果我們想獲得潛在客戶的聯絡資訊,則最終得到空phone,而不是電子郵件,如下所示:
SELECT id,'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,COALESCE(NULLIF(phone,''),'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相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》、《MySQL資料庫鎖相關技巧彙總》及《MySQL常用函式大彙總》
希望本文所述對大家MySQL資料庫計有所幫助。