mysql中的钱null,mysql 中null总结
======================
相信很多用了mysql很久的人,對這兩個字段屬性的概念還不是很清楚,一般會有以下疑問:
1、我字段類型是not null,為什么我可以插入空值
2、為毛not null的效率比null高
3、判斷字段不為空的時候,到底要? select * from table where column <> ” 還是要用 select * from table where column is not null 呢。
帶著上面幾個疑問,我們來深入研究一下null 和 not null 到底有什么不一樣。
首先,我們要搞清楚“空值” 和 “NULL” 的概念:
1、空值是不占用空間的
2、mysql中的NULL其實是占用空間的,下面是來自于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.”
打個比方來說,你有一個杯子,空值代表杯子是真空的,NULL代表杯子中裝滿了空氣,雖然杯子看起來都是空的,但是區別是很大的。
搞清楚“空值”和“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 ;
插入數據:
INSERT INTO `test` VALUES (null,1);
mysql發生錯誤:
#1048 – Column ‘col1’ cannot be null
再來一條
INSERT INTO `test` VALUES (”,1);
成功插入。
可見,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的問題1也就有答案了。
對于問題2,上面我們已經說過了,NULL 其實并不是空值,而是要占用空間,所以mysql在進行比較的時候,NULL 會參與字段比較,所以對效率有一部分影響。
而且B樹索引時不會存儲NULL值的,所以如果索引的字段可以為NULL,索引的效率會下降很多。
我們再向test的表中插入幾條數據:
[php] view plaincopy
INSERT INTO `test` VALUES (”, NULL);
INSERT INTO `test` VALUES (‘1’, ‘2’);
現在表中數據:
現在根據需求,我要統計test表中col1不為空的所有數據,我是該用“<> ”” 還是 “IS NOT NULL” 呢,讓我們來看一下結果的區別。
[php] view plaincopy
SELECT * FROM `test` WHERE col1 IS NOT NULL
SELECT * FROM `test` WHERE col1 <> ”
可以看到,結果迥然不同,所以我們一定要根據業務需求,搞清楚到底是要用那種搜索條件。
=============
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’也可以在某些情形下使用。見7.16 LOAD DATA INFILE句法。
當使用ORDER BY時,首先呈現NULL值。如果你用DESC以降序排序,NULL值最后顯示。當使用GROUP BY時,所有的NULL值被認為是相等的。
為了有助于NULL的處理,你能使用IS NULL和IS NOT NULL運算符和IFNULL()函數。
=================================================================
數據庫中存在null,那么怎樣查找這些值是null的記錄呢?
MySql數據庫
法/步驟
1
查找到某一個字段是null的記錄,最簡單的想法可能是這樣:
select *from? tableName where columnName = null
但是這樣是不行的,因為null不能和任何值比較。在SQL中,NULL值與任何其它值的比較(即使是NULL)永遠不會為“真”。包含NULL的表達式總是會導出NULL值,除非在關于操作符的文檔中以及表達式的函數中作了其他規定。
2
我曾經犯的錯誤如下:
注意,紅色字體的查詢條件只能查詢出pass_name!=’batch’且不為null的字段(null不能和任何值比較,即使是null也不會是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’(錯誤)
查詢出包含null且pass_name!=’batch’的數據:
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表示的含義是未知,即不知道有沒有。和‘’空字符串不等,因為空字符串相當于沒有值。null代表的是不知道有沒有值。所以在數據查詢中如果字段默認值是null,想查詢出不等于某個條件的一定要加上——字段名 is null 或者字段名 is not null來包含是null或者不是null的字段
END
注意事項
null和任何值都不能比較
null只能用is null 或者is not null 來判斷,不能用=或者!=來判斷null和任何值都不能比較
null只能用is null 或者is not null 來判斷,不能用=或者!=來判斷
喜歡 (0)or分享 (0)
總結
以上是生活随笔為你收集整理的mysql中的钱null,mysql 中null总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中如何上传非表单类数据,PHP P
- 下一篇: matlab抓取股票数据,Matlab经