mysql中null(IFNULL,COALESCE和NULLIF)相關(guān)知識點總結(jié)
本文實例講述了mysql中null(IFNULL,COALESCE和NULLIF)相關(guān)知識點。分享給大家供大家參考,具體如下:
在MySQL中,NULL值表示一個未知值,它不同于0或空字符串'',并且不等于它自身。
我們?nèi)绻麑ULL值與另一個NULL值或任何其他值進行比較,則結(jié)果為NULL,因為一個不知道是什么的值(NULL值)與另一個不知道是什么的值(NULL值)比較,其值當(dāng)然也是一個不知道是什么的值(NULL值)。
然而我們通常,使用NULL值來表示數(shù)據(jù)丟失,未知或不適用的情況。 例如,潛在客戶的電話號碼可能為NULL,并且可以稍后添加。所以我們創(chuàng)建表時,可以通過使用NOT NULL約束來指定列是否接受NULL值。接下來,我們來創(chuàng)建一張leads表,并且以此為依據(jù)來具體了解下:
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值來指定數(shù)據(jù)丟失。 例如,以下語句將一行插入到線索表中。 因為電話號碼丟失,所以使用NULL值:
INSERT INTO leads(first_name,last_name,source,email,phone) VALUE('John','Doe','Web Search','john.doe@yiibai.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');
完事如果我們要將列的值設(shè)置為NULL,可以使用賦值運算符(=)。 例如,要將David William的手機(phone)更新為NULL,請使用以下UPDATE語句:
UPDATE leads SET phone = NULL WHERE id = 3;
但是如果使用order by子句按升序?qū)Y(jié)果集進行排序,則MySQL認為NULL值低于其他值,因此,它會首先顯示NULL值。以下查詢語句按照電話號碼(phone)升序排列:
SELECT * FROM leads ORDER BY phone;
執(zhí)行上面查詢語句,結(jié)果如下:
+----+------------+-----------+--------------+---------------------+----------------+ | id | first_name | last_name | source | email | phone | +----+------------+-----------+--------------+---------------------+----------------+ | 1 | John | Doe | Web Search | john.doe@yiibai.com | NULL | | 3 | David | William | Web Search | NULL | NULL | | 2 | Lily | Bush | Cold Calling | NULL | (408)-555-1234 | +----+------------+-----------+--------------+---------------------+----------------+
如果使用ORDER BY DESC,NULL值將顯示在結(jié)果集的最后:
SELECT * FROM leads ORDER BY phone DESC;
執(zhí)行上面查詢語句,結(jié)果如下:
+----+------------+-----------+--------------+---------------------+----------------+ | id | first_name | last_name | source | email | phone | +----+------------+-----------+--------------+---------------------+----------------+ | 2 | Lily | Bush | Cold Calling | NULL | (408)-555-1234 | | 1 | John | Doe | Web Search | john.doe@yiibai.com | NULL | | 3 | David | William | Web Search | NULL | NULL | +----+------------+-----------+--------------+---------------------+----------------+ 3 rows in set
我們?nèi)绻诓樵冎袦y試NULL,可以在where子句中使用IS NULL或IS NOT NULL運算符。例如,要獲得尚未提供電話號碼的潛在客戶,請使用IS NULL運算符,如下所示:
SELECT * FROM leads WHERE phone IS NULL;
執(zhí)行上面查詢語句,結(jié)果如下:
+----+------------+-----------+------------+---------------------+-------+ | id | first_name | last_name | source | email | phone | +----+------------+-----------+------------+---------------------+-------+ | 1 | John | Doe | Web Search | john.doe@yiibai.com | NULL | | 3 | David | William | Web Search | NULL | NULL | +----+------------+-----------+------------+---------------------+-------+ 2 rows in set
我們還可以使用IS NOT運算符來獲取所有提供電子郵件地址的潛在客戶:
SELECT * FROM leads WHERE email IS NOT NULL;
執(zhí)行上面查詢語句,結(jié)果如下:
+----+------------+-----------+------------+---------------------+-------+ | id | first_name | last_name | source | email | phone | +----+------------+-----------+------------+---------------------+-------+ | 1 | John | Doe | Web Search | john.doe@yiibai.com | NULL | +----+------------+-----------+------------+---------------------+-------+ 1 row in set
然而,即使NULL不等于NULL,GROUP BY子句中視兩個NULL值相等,來看下sql實例:
SELECT email, count(*) FROM leads GROUP BY email;
該查詢只返回兩行,因為其郵箱(email)列為NULL的行被分組為一行,結(jié)果如下所示:
+---------------------+----------+ | email | count(*) | +---------------------+----------+ | NULL | 2 | | john.doe@yiibai.com | 1 | +---------------------+----------+ 2 rows in set
我們要知道在列上使用唯一約束或UNIQUE索引時,可以在該列中插入多個NULL值,在這種情況下,MySQL認為NULL值是不同的。接下來我們通過為phone列創(chuàng)建一個UNIQUE索引來驗證這一點:
CREATE UNIQUE INDEX idx_phone ON leads(phone);
這里我們要注意,如果使用BDB存儲引擎的話,mysql會認為NULL值相等,因此我們不能將多個NULL值插入到具有唯一約束的列中。
既然知道了null的好處和壞處,我們就來看下在mysql中應(yīng)該如何處理它吧。mysql一共提供了三個函數(shù),分別是IFNULL,COALESCE和NULLIF。
我們來分別看下,首先,IFNULL函數(shù)接受兩個參數(shù)。 如果IFNULL函數(shù)不為NULL,則返回第一個參數(shù),否則返回第二個參數(shù)。例如,如果不是NULL,則以下語句返回電話號碼(phone),否則返回N/A,而不是NULL。來看個實例:
SELECT id, first_name, last_name, IFNULL(phone, 'N/A') phone FROM leads;
執(zhí)行上面查詢語句,得到以下結(jié)果:
+----+------------+-----------+----------------+ | 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函數(shù),它接受參數(shù)列表,并返回第一個非NULL參數(shù)。 例如,可以使用COALESCE函數(shù)根據(jù)信息的優(yōu)先級按照以下順序顯示線索的聯(lián)系信息:phone, email和N/A。以下是案例:
SELECT id, first_name, last_name, COALESCE(phone, email, 'N/A') contact FROM leads;
執(zhí)行上面查詢語句,得到以下代碼:
+----+------------+-----------+---------------------+ | id | first_name | last_name | contact | +----+------------+-----------+---------------------+ | 1 | John | Doe | john.doe@yiibai.com | | 2 | Lily | Bush | (408)-555-1234 | | 3 | David | William | N/A | +----+------------+-----------+---------------------+ 3 rows in set
最后就是NULLIF函數(shù)了,它接受兩個參數(shù)。如果兩個參數(shù)相等,則NULLIF函數(shù)返回NULL。 否則,它返回第一個參數(shù)。在列中同時具有NULL和空字符串值時,NULLIF函數(shù)很有用。 例如,我們錯誤地將以下行插入到leads表中:
INSERT INTO leads(first_name,last_name,source,email,phone) VALUE('Thierry','Henry','Web Search','thierry.henry@yiibai.com','');
因為phone是一個空字符串:'',而不是NULL。所以,如果我們想獲得潛在客戶的聯(lián)系信息,則最終得到空phone,而不是電子郵件,如下所示:
SELECT id, first_name, last_name, COALESCE(phone, email, 'N/A') contact FROM leads;
執(zhí)行上面查詢語句,得到以下代碼:
+----+------------+-----------+---------------------+ | id | first_name | last_name | contact | +----+------------+-----------+---------------------+ | 1 | John | Doe | john.doe@yiibai.com | | 2 | Lily | Bush | (408)-555-1234 | | 3 | David | William | N/A | | 4 | Thierry | Henry | | +----+------------+-----------+---------------------+
我們?nèi)绻鉀Q這個問題,就要使用NULLIF函數(shù)將電話與空字符串('')進行比較,如果相等,則返回NULL,否則返回電話號碼:
SELECT id, first_name, last_name, COALESCE(NULLIF(phone, ''), email, 'N/A') contact FROM leads;
執(zhí)行上面查詢語句,得到以下代碼:
+----+------------+-----------+--------------------------+ | id | first_name | last_name | contact | +----+------------+-----------+--------------------------+ | 1 | John | Doe | john.doe@yiibai.com | | 2 | Lily | Bush | (408)-555-1234 | | 3 | David | William | N/A | | 4 | Thierry | Henry | thierry.henry@yiibai.com | +----+------------+-----------+--------------------------+ 4 rows in set
好啦,本次記錄就到這里了。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
- Mysql中isnull,ifnull,nullif的用法及語義詳解
- MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函數(shù)的用法解讀
- MySQL中NULLIF?、IFNULL、IF的用法和區(qū)別舉例詳解
- MySql中的IFNULL、NULLIF和ISNULL用法詳解
- MySQL流程控制IF()、IFNULL()、NULLIF()、ISNULL()函數(shù)的使用
- MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函數(shù)的使用詳解
- MySql中的IFNULL、NULLIF和ISNULL用法詳解
- MYSQL中IFNULL和NULLIF函數(shù)的區(qū)別小結(jié)
相關(guān)文章
多次執(zhí)行mysql_fetch_array()的指針歸位問題探討
多次執(zhí)行mysql_fetch_array(),在第二次執(zhí)行的時候,如果不加處理,就不會輸出任何內(nèi)容,這種情況下只需要對循環(huán)指針進行復(fù)位即可,感興趣的朋友可以了解下啊,或許對你有所幫助2013-01-01mysql數(shù)據(jù)被誤刪的恢復(fù)方案以及預(yù)防措施
這篇文章主要介紹了幾種常見的MySQL數(shù)據(jù)恢復(fù)方法,包括使用備份、二進制日志、InnoDB表空間恢復(fù)以及第三方工具,每種方法都有其優(yōu)缺點,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-02-02mysql死鎖(dead lock)與鎖等待(lock wait)的出現(xiàn)解決
死鎖和鎖等待是數(shù)據(jù)庫運維中常見的問題,區(qū)別在于死鎖會自動解除,而鎖等待需要手動處理,本文就來介紹一下mysql死鎖(dead lock)與鎖等待(lock wait),感興趣的可以了解一下2024-09-09淺談MySQL存儲引擎選擇 InnoDB與MyISAM的優(yōu)缺點分析
MyISAM 是MySQL中默認的存儲引擎,一般來說不是有太多人關(guān)心這個東西。決定使用什么樣的存儲引擎是一個很tricky的事情,但是還是值我們?nèi)パ芯恳幌?,這里的文章只考慮 MyISAM 和InnoDB這兩個,因為這兩個是最常見的2013-06-06sql查詢語句教程之插入、更新和刪除數(shù)據(jù)實例
如果要在程序運行過程中操作數(shù)據(jù)庫中的數(shù)據(jù),那得先學(xué)會使用SQL語句,下面這篇文章主要給大家介紹了關(guān)于sql查詢語句教程之插入、更新和刪除數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-06-06MySQL分組的時候遇到ONLY_FULL_GROUP_BY報錯問題及解決方案
這篇文章主要介紹了MySQL分組的時候遇到ONLY_FULL_GROUP_BY報錯問題及解決方案,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04MySQL replace函數(shù)替換字符串語句的用法
MySQL replace函數(shù)我們經(jīng)常用到,下面就為您詳細介紹MySQL replace函數(shù)的用法,希望對您學(xué)習(xí)MySQL replace函數(shù)方面能有所啟迪。2010-12-12