程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中關於NULL值的懂得和應用教程

MySQL中關於NULL值的懂得和應用教程

編輯:MySQL綜合教程

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的字段,可以拔出''

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved