MySQL中關於NULL值的懂得和應用教程。本站提示廣大學習愛好者:(MySQL中關於NULL值的懂得和應用教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中關於NULL值的懂得和應用教程正文
NULL值的概念是形成SQL的老手的混雜的廣泛緣由,他們常常以為NULL是和一個空字符串''的一樣的器械。不是如許的!例如,以下語句是完整分歧的:
mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES ("");
兩個語句把值拔出到phone列,然則第一個拔出一個NULL值而第二個拔出一個空字符串。第一個的寄義可以以為是“德律風號碼不曉得”,而第二個則可意味著“她沒有德律風”。
在SQL中,NULL值在於任何其他值乃至NULL值比擬時老是假的(FALSE)。包括NULL的一個表達式老是發生一個NULL值,除非在包括在表達式中的運算符和函數的文檔中指出。鄙人列例子,一切的列前往NULL:
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
假如你想要尋覓值是NULL的列,你不克不及應用=NULL測試。以下語句不前往任何行,由於對任何表達式,expr = NULL是假的:
mysql> SELECT * FROM my_table WHERE phone = NULL;
要想尋覓NULL值,你必需應用IS NULL測試。下例顯示若何找出NULL德律風號碼和空的德律風號碼:
mysql> SELECT * FROM my_table WHERE phone IS NULL; mysql> SELECT * FROM my_table WHERE phone = "";
在MySQL中,就像許多其他的SQL辦事器一樣,你不克不及索引可以有NULL值的列。你必需聲明如許的列為NOT NULL,並且,你不克不及拔出NULL到索引的列中。
當用LOAD DATA INFILE讀取數據時,空列用''更新。假如你想要在一個列中有NULL值,你應當在文本文件中應用\N。字面上的詞'NULL'也能夠在某些情況下應用。
當應用ORDER BY時,起首出現NULL值。假如你用DESC以降序排序,NULL值最初顯示。當應用GROUP BY時,一切的NULL值被以為是相等的。
為了有助於NULL的處置,你能應用IS NULL和IS NOT NULL運算符和IFNULL()函數。
MySQL的 IFNULL() 函數和Oracle的 NVL() 函數功效相似。以下簡略舉例:
IFNULL(expr1, expr2)
假如expr1不是NULL,IFNULL()前往expr1,不然它前往expr2。IFNULL()前往一個數字或字符串值,取決於它被應用的高低文情況。
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函數前往replace_with的值,不然前往string1的值。
引伸一下,此NVL的感化與SQLserver 中的 ISNULL( string1, replace_with) 一樣。
留意事項:string1和replace_with必需為統一數據類型,除非顯式的應用TO_CHAR函數。
例:
NVL(TO_CHAR(numeric_column), 'some string')
個中numeric_column代指某個數字類型的值。
例:
nvl(yanlei777,0) > 0
NVL(yanlei777, 0) 的意思是 假如 yanlei777 是NULL,則取 0值
null與空值的辨析
來看如許一段代碼:
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 ;
毛病(弗成以拔出null值):
INSERT INTO `test` VALUES (null,1);
准確(拔出''沒成績):
INSERT INTO `test` VALUES ('',1); INSERT INTO `test` VALUES ('', NULL); INSERT INTO `test` VALUES ('1', '2');
檢索(''不是null,所以not null會把''都算出來):
SELECT * FROM `test` WHERE col1 IS NOT NULL
成果:一切三條數據
檢索(正常檢索):
SELECT * FROM `test` WHERE col1 <> ''
成果:最初一條數據
檢索(<>'',會同時消除''和null的數據,只檢索有內容的數據):
SELECT * FROM `test` WHERE col2<>''
總結:
1. null的存儲不是'',是其它特別的字符表現。
2. null在檢索<>''的時刻,也會被消除,由於沒有真正成心義的內容
3. not null嚴厲依照字面意思,''不會被消除。
4. 界說not null的字段,可以拔出''