MySQL中對(duì)于NULL值的理解和使用教程
NULL值的概念是造成SQL的新手的混淆的普遍原因,他們經(jīng)常認(rèn)為NULL是和一個(gè)空字符串''的一樣的東西。不是這樣的!例如,下列語(yǔ)句是完全不同的:
mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES ("");
兩個(gè)語(yǔ)句把值插入到phone列,但是第一個(gè)插入一個(gè)NULL值而第二個(gè)插入一個(gè)空字符串。第一個(gè)的含義可以認(rèn)為是“電話號(hào)碼不知道”,而第二個(gè)則可意味著“她沒有電話”。
在SQL中,NULL值在于任何其他值甚至NULL值比較時(shí)總是假的(FALSE)。包含NULL的一個(gè)表達(dá)式總是產(chǎn)生一個(gè)NULL值,除非在包含在表達(dá)式中的運(yùn)算符和函數(shù)的文檔中指出。在下列例子,所有的列返回NULL:
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
如果你想要尋找值是NULL的列,你不能使用=NULL測(cè)試。下列語(yǔ)句不返回任何行,因?yàn)閷?duì)任何表達(dá)式,expr = NULL是假的:
mysql> SELECT * FROM my_table WHERE phone = NULL;
要想尋找NULL值,你必須使用IS NULL測(cè)試。下例顯示如何找出NULL電話號(hào)碼和空的電話號(hào)碼:
mysql> SELECT * FROM my_table WHERE phone IS NULL; mysql> SELECT * FROM my_table WHERE phone = "";
在MySQL中,就像很多其他的SQL服務(wù)器一樣,你不能索引可以有NULL值的列。你必須聲明這樣的列為NOT NULL,而且,你不能插入NULL到索引的列中。
當(dāng)用LOAD DATA INFILE讀取數(shù)據(jù)時(shí),空列用''更新。如果你想要在一個(gè)列中有NULL值,你應(yīng)該在文本文件中使用\N。字面上的詞'NULL'也可以在某些情形下使用。
當(dāng)使用ORDER BY時(shí),首先呈現(xiàn)NULL值。如果你用DESC以降序排序,NULL值最后顯示。當(dāng)使用GROUP BY時(shí),所有的NULL值被認(rèn)為是相等的。
為了有助于NULL的處理,你能使用IS NULL和IS NOT NULL運(yùn)算符和IFNULL()函數(shù)。
MySQL的 IFNULL() 函數(shù)和Oracle的 NVL() 函數(shù)功能類似。以下簡(jiǎn)單舉例:
IFNULL(expr1, expr2)
如果expr1不是NULL,IFNULL()返回expr1,否則它返回expr2。IFNULL()返回一個(gè)數(shù)字或字符串值,取決于它被使用的上下文環(huán)境。
mysql> select IFNULL(1,0); -> 1 mysql> select IFNULL(0,10); -> 0 mysql> select IFNULL(1/0,10); -> 10 mysql> select IFNULL(1/0,'yes'); -> 'yes' NVL( string1, replace_with)
功能:如果string1為NULL,則NVL函數(shù)返回replace_with的值,否則返回string1的值。
引申一下,此NVL的作用與SQLserver 中的 ISNULL( string1, replace_with) 一樣。
注意事項(xiàng):string1和replace_with必須為同一數(shù)據(jù)類型,除非顯式的使用TO_CHAR函數(shù)。
例:
NVL(TO_CHAR(numeric_column), 'some string')
其中numeric_column代指某個(gè)數(shù)字類型的值。
例:
nvl(yanlei777,0) > 0
NVL(yanlei777, 0) 的意思是 如果 yanlei777 是NULL,則取 0值
null與空值的辨析
來(lái)看這樣一段代碼:
CREATE TABLE `test` ( `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ) ENGINE = MYISAM ;
錯(cuò)誤(不可以插入null值):
INSERT INTO `test` VALUES (null,1);
正確(插入''沒問(wèn)題):
INSERT INTO `test` VALUES ('',1); INSERT INTO `test` VALUES ('', NULL); INSERT INTO `test` VALUES ('1', '2');
檢索(''不是null,所以not null會(huì)把''都算進(jìn)去):
SELECT * FROM `test` WHERE col1 IS NOT NULL
結(jié)果:所有三條數(shù)據(jù)
檢索(正常檢索):
SELECT * FROM `test` WHERE col1 <> ''
結(jié)果:最后一條數(shù)據(jù)
檢索(<>'',會(huì)同時(shí)排除''和null的數(shù)據(jù),只檢索有內(nèi)容的數(shù)據(jù)):
SELECT * FROM `test` WHERE col2<>''
總結(jié):
1. null的存儲(chǔ)不是'',是其它特殊的字符表示。
2. null在檢索<>''的時(shí)候,也會(huì)被排除,因?yàn)闆]有真正有意義的內(nèi)容
3. not null嚴(yán)格按照字面意思,''不會(huì)被排除。
4. 定義not null的字段,可以插入''
相關(guān)文章
Mysql系列SQL查詢語(yǔ)句書寫順序及執(zhí)行順序詳解
這篇文章主要為大家介紹了Mysql系列SQL查詢語(yǔ)句的書寫順序及執(zhí)行順序示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10安裝rpm包時(shí)提示錯(cuò)誤:依賴檢測(cè)失敗的解決方法
今天在虛擬機(jī)中裝MySQL的時(shí)候,突然出現(xiàn)了這個(gè)依賴檢測(cè)錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于安裝rpm包時(shí)提示錯(cuò)誤:依賴檢測(cè)失敗的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09MySQL導(dǎo)出數(shù)據(jù)遇到secure-file-priv問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了MySQL導(dǎo)出數(shù)據(jù)遇到secure-file-priv問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Canal監(jiān)聽MySQL的實(shí)現(xiàn)步驟
本文主要介紹了Canal監(jiān)聽MySQL的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08MySql利用父id遞歸向下查詢子節(jié)點(diǎn)的方法實(shí)例
項(xiàng)目中遇到一個(gè)需求,要求查處菜單節(jié)點(diǎn)的所有節(jié)點(diǎn),在網(wǎng)上查了一下,大多數(shù)的方法用到了存儲(chǔ)過(guò)程,由于線上環(huán)境不能隨便添加存儲(chǔ)過(guò)程,所以自己寫一個(gè),這篇文章主要給大家介紹了關(guān)于MySql利用父id遞歸向下查詢子節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-03-03