mysql中的钱null,mysql 中null总结
======================
相信很多用了mysql很久的人,對(duì)這兩個(gè)字段屬性的概念還不是很清楚,一般會(huì)有以下疑問(wèn):
1、我字段類型是not null,為什么我可以插入空值
2、為毛not null的效率比null高
3、判斷字段不為空的時(shí)候,到底要? select * from table where column <> ” 還是要用 select * from table where column is not null 呢。
帶著上面幾個(gè)疑問(wèn),我們來(lái)深入研究一下null 和 not null 到底有什么不一樣。
首先,我們要搞清楚“空值” 和 “NULL” 的概念:
1、空值是不占用空間的
2、mysql中的NULL其實(shí)是占用空間的,下面是來(lái)自于MYSQL官方的解釋
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
打個(gè)比方來(lái)說(shuō),你有一個(gè)杯子,空值代表杯子是真空的,NULL代表杯子中裝滿了空氣,雖然杯子看起來(lái)都是空的,但是區(qū)別是很大的。
搞清楚“空值”和“NULL”的概念之后,問(wèn)題基本就明了了,我們搞個(gè)例子測(cè)試一下:
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 ;
插入數(shù)據(jù):
INSERT INTO `test` VALUES (null,1);
mysql發(fā)生錯(cuò)誤:
#1048 – Column ‘col1’ cannot be null
再來(lái)一條
INSERT INTO `test` VALUES (”,1);
成功插入。
可見(jiàn),NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的問(wèn)題1也就有答案了。
對(duì)于問(wèn)題2,上面我們已經(jīng)說(shuō)過(guò)了,NULL 其實(shí)并不是空值,而是要占用空間,所以mysql在進(jìn)行比較的時(shí)候,NULL 會(huì)參與字段比較,所以對(duì)效率有一部分影響。
而且B樹(shù)索引時(shí)不會(huì)存儲(chǔ)NULL值的,所以如果索引的字段可以為NULL,索引的效率會(huì)下降很多。
我們?cè)傧騮est的表中插入幾條數(shù)據(jù):
[php] view plaincopy
INSERT INTO `test` VALUES (”, NULL);
INSERT INTO `test` VALUES (‘1’, ‘2’);
現(xiàn)在表中數(shù)據(jù):
現(xiàn)在根據(jù)需求,我要統(tǒng)計(jì)test表中col1不為空的所有數(shù)據(jù),我是該用“<> ”” 還是 “IS NOT NULL” 呢,讓我們來(lái)看一下結(jié)果的區(qū)別。
[php] view plaincopy
SELECT * FROM `test` WHERE col1 IS NOT NULL
SELECT * FROM `test` WHERE col1 <> ”
可以看到,結(jié)果迥然不同,所以我們一定要根據(jù)業(yè)務(wù)需求,搞清楚到底是要用那種搜索條件。
=============
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è)則可意味著“她沒(méi)有電話”。
在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’也可以在某些情形下使用。見(jiàn)7.16 LOAD DATA INFILE句法。
當(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ù)。
=================================================================
數(shù)據(jù)庫(kù)中存在null,那么怎樣查找這些值是null的記錄呢?
MySql數(shù)據(jù)庫(kù)
法/步驟
1
查找到某一個(gè)字段是null的記錄,最簡(jiǎn)單的想法可能是這樣:
select *from? tableName where columnName = null
但是這樣是不行的,因?yàn)閚ull不能和任何值比較。在SQL中,NULL值與任何其它值的比較(即使是NULL)永遠(yuǎn)不會(huì)為“真”。包含NULL的表達(dá)式總是會(huì)導(dǎo)出NULL值,除非在關(guān)于操作符的文檔中以及表達(dá)式的函數(shù)中作了其他規(guī)定。
2
我曾經(jīng)犯的錯(cuò)誤如下:
注意,紅色字體的查詢條件只能查詢出pass_name!=’batch’且不為null的字段(null不能和任何值比較,即使是null也不會(huì)是true),如果需要查詢出pass_name是null的字段,必須顯示的加上:or pass_name is NULL
SELECT COUNT(*) FROM 表名 WHERE FROM_UNIXTIME(submit_time) >= ‘2012-08-01’ AND FROM_UNIXTIME(submit_time) < ‘2013-07-01’ AND pass_name <> ‘test’(錯(cuò)誤)
查詢出包含null且pass_name!=’batch’的數(shù)據(jù):
SELECT COUNT(*) FROM 表名 WHERE FROM_UNIXTIME(submit_time) >= ‘2012-08-01’ AND FROM_UNIXTIME(submit_time) < ‘2013-07-01’ AND (pass_name <> ‘test’ or pass_name is null)(正確查出pass_name!=null及pass_name是null的)
3
null表示的含義是未知,即不知道有沒(méi)有。和‘’空字符串不等,因?yàn)榭兆址喈?dāng)于沒(méi)有值。null代表的是不知道有沒(méi)有值。所以在數(shù)據(jù)查詢中如果字段默認(rèn)值是null,想查詢出不等于某個(gè)條件的一定要加上——字段名 is null 或者字段名 is not null來(lái)包含是null或者不是null的字段
END
注意事項(xiàng)
null和任何值都不能比較
null只能用is null 或者is not null 來(lái)判斷,不能用=或者!=來(lái)判斷null和任何值都不能比較
null只能用is null 或者is not null 來(lái)判斷,不能用=或者!=來(lái)判斷
喜歡 (0)or分享 (0)
總結(jié)
以上是生活随笔為你收集整理的mysql中的钱null,mysql 中null总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php中如何上传非表单类数据,PHP P
- 下一篇: php中mysql,PHP中的mysql