日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql中0和空值_SQL中空值 和NULL的概念:

發布時間:2024/9/19 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的概念:的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。