mysql中0和空值_SQL中空值 和NULL的概念:
在詳細講解null之前,我們先看一個例子
表數據如下:
3306>select * from t1;
+------+-------+
| id | name |
+------+-------+
| 1 | chen |
| 2 | zhang |
| 3 | NULL |
+------+-------+
3 rows in set (0.00 sec)
然后我們想查出所有名字不為'chen'的其它行記錄,我們有可能這樣寫:
3306>select * from t1 where name!='chen';
+------+-------+
| id | name |
+------+-------+
| 2 | zhang |
+------+-------+
1 row in set (0.00 sec)
但是結果好像不太如我們所愿,id為1的那條記錄沒有被查出來,null肯定和'chen'不相等呀,為什么會查不出呢?
NUll值對于新手來說非常容易混淆,經常會被認為null與空字符串''是一樣的,但事實上,這兩者是非常不一樣,NULL表示的是“a missing unknown value”,
而字符串''是一個確定的值,這本質上就已經不一樣了。
舉個例子:
mysql> INSERT INTO t_user (phone) VALUES (NULL); mysql> INSERT INTO t_user (phone) VALUES ('');
第一條insert語句認為這個手機號還不確定是多少,是a missing unknown phone number
第二條代表這個手機號碼是確定的,它的手機號碼為空字符串
為了處理和null相關的比較,在mysql中可以用is null、is not null、<=>(NULL的安全等于,與=相同,但是考慮到了NULL值,與其他值一樣可以進行比較)、
isnull()來測試比較,不能用如=、來和null值比較測試,任何值(包括和null本身)與null對比和函數運算操作結果都為null
如下三個例子可以說明問題:
任何與null的相關操作都為null
3306>SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
+------+--------+--------------------------+
| NULL | 1+NULL | CONCAT('Invisible',NULL) |
+------+--------+--------------------------+
| NULL | NULL | NULL |
+------+--------+--------------------------+
1 row in set (0.00 sec)
3306>SELECT 1>NULL, 1=NULL, 1!=NULL;
+--------+--------+---------+
| 1>NULL | 1=NULL | 1!=NULL |
+--------+--------+---------+
| NULL | NULL | NULL |
+--------+--------+---------+
1 row in set (0.00 sec)
用指定的函數操作才能返回0或1
3306 > SELECT 1 IS NULL, 1 IS NOT NULL, 1<=>NULL,NULL<=>NULL;
+-----------+---------------+----------+-------------+
| 1 IS NULL | 1 IS NOT NULL | 1<=>NULL | NULL<=>NULL |
+-----------+---------------+----------+-------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+----------+-------------+
1 row in set (0.00 sec)
但是呢,凡事都有個例外:
當用distinct、group by、order by時,此時不同的null值被視為相等計算。
最重要的是,在mysql中,0和null代表假,其它的任何值都代表真
所以回頭看最開始的例子,當我們的where條件為name!='chen'時,它與id=1的行進行比較,即測試:
'chen'!='chen'
這個測試結果為0,為假,所以id=1這一行就不會被查出來。接下來再測試:
'zhang'!='chen'
這個測試結果為1,為真,所以id=2這一行就可以被查出來。接下來再測試:
NULL!='chen'
這個測試結果為NULL,為假,所以id=3這一行就不會被查出來。
所以最終的結果就只有id=2這一行的數據被查出來了。
那如果要達到我們的目地怎么辦?
3306>select * from t1 where name!='chen' or name is null;
+------+-------+
| id | name |
+------+-------+
| 2 | zhang |
| 3 | NULL |
+------+-------+
2 rows in set (0.01 sec)
或
3306>select * from t1 where ifnull(name,0)!='chen' ;
+------+-------+
| id | name |
+------+-------+
| 2 | zhang |
| 3 | NULL |
+------+-------+
2 rows in set (0.00 sec)
推薦用第一種方法。
因為mysql對了null列的查找是有查詢優化的:
3306>explain select * from test a where a.code='AAAAAA' or a.code is null\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref_or_null
possible_keys: code
key: code
key_len: 21
ref: const
rows: 73603
Extra: Using index condition
1 row in set (0.01 sec)
而第二種在列上加上函數的查詢時索引是不起作用的。
其它注意事項
1、用order by ... asc時,null值會被放在最前面,而用order by ... desc時,null時會被放在最后面,相當于null是一個無窮小的值。
2、聚合函數如count(),min(),sum()是忽略null值的。唯一的例外是用count(*),如
SELECT COUNT(*), COUNT(age) FROM person;
如上語句是第一個count(*)是計算person表總行數,而第二個是計算person表age列非null的行數
3、在MyISAM;和InnoDB MEMORY引擎中,是可以在包含null值的列添加索引的,而在其它引擎中則必須聲明為not null才可以添加索引
4、當用load data infile時,空的或者沒有的列將用空字符''代替,如果要導入null值,需要在數據文件里用\N來表示。
5、如果你往timestamp插入null值,則當前時間會被插入,如果一個自增列插入null值,下一個自增值將會被插入。
總結
以上是生活随笔為你收集整理的mysql中0和空值_SQL中空值 和NULL的概念:的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 双节点主从搭建_MySQL
- 下一篇: 怎么做好吃的汤圆?