欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中NULL和空值的區(qū)別及說明

 更新時間:2023年12月13日 10:24:45   作者:kangfu_521  
這篇文章主要介紹了MySQL中NULL和空值的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

MySQL中NULL和空值的區(qū)別

簡介

NULL也就是在字段中存儲NULL值,空值也就是字段中存儲空字符(’’)。 

區(qū)別

1、空值不占空間,NULL值占空間。當字段不為NULL時,也可以插入空值。

2、當使用 IS NOT NULL 或者 IS NULL 時,只能查出字段中沒有不為NULL的或者為 NULL 的,不能查出空值。

3、判斷NULL 用IS NULL 或者 is not null,SQL 語句函數(shù)中可以使用IFNULL()函數(shù)來進行處理,判斷空字符用 =’‘或者<>’'來進行處理。

4、在進行count()統(tǒng)計某列的記錄數(shù)的時候,如果采用的NULL值,會別系統(tǒng)自動忽略掉,但是空值是會進行統(tǒng)計到其中的。

5、MySql中如果某一列中含有NULL,那么包含該列的索引就無效了。這一句不是很準確。

6:實際到底是使用NULL值還是空值(’’),根據(jù)實際業(yè)務(wù)來進行區(qū)分。個人建議在實際開發(fā)中如果沒有特殊的業(yè)務(wù)場景,可以直接使用空值。

區(qū)別驗證

1、占用空間區(qū)別

mysql>  select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL         |          0 |           1 |
+--------------+------------+-------------+
1 row in set

通俗的講:

空值就像是一個真空轉(zhuǎn)態(tài)杯子,什么都沒有,而NULL值就是一個裝滿空氣的杯子,雖然看起來都是一樣的,但是有著本質(zhì)的區(qū)別。

NULL columns require additional space in the row to record whether their values are NULL.

NULL列需要行中的額外空間來記錄它們的值是否為NULL。

小結(jié):從上面看出空值(’’)的長度是0,是不占用空間的;而的NULL長度是NULL,其實它是占用空間的,看下面說明。

2、插入/查詢方式區(qū)別

CREATE TABLE `tb_test` (
  `one` varchar(10) NOT NULL,
  `two` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 全部插入 NULL,失敗
mysql> INSERT tb_test VALUES (NULL,NULL);
1048 - Column 'one' cannot be null


-- 全部插入 空值,成功
mysql> INSERT tb_test VALUES ('','');
Query OK, 1 row affected

-- 模擬數(shù)據(jù):
INSERT tb_test VALUES (1,NULL);
INSERT tb_test VALUES ('',2);
INSERT tb_test VALUES (3,3);
`

--空值字段:
-- 使用 is null/is not null
mysql> SELECT * FROM tb_test where one is NULL;
Empty set

mysql> SELECT * FROM tb_test where one is not NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
|     | 2    |
| 3   | 3    |
+-----+------+
3 rows in set
-- 使用 = 、!=
mysql> SELECT * FROM tb_test where one = '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
+-----+-----+
1 row in set

mysql> SELECT * FROM tb_test where one != '';
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
| 3   | 3    |
+-----+------+
2 rows in set


--NULL值字段:

-- 使用 is null/is not null
mysql> SELECT * FROM tb_test where two is not NULL;
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in set

mysql> SELECT * FROM tb_test where two is NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
+-----+------+
1 row in set

-- 使用 = 、!=
mysql> SELECT * FROM tb_test where two = '';
Empty set

mysql> SELECT * FROM tb_test where two != '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in set



小結(jié):

如果要單純查NULL值列,則使用 is NULL去查,單純?nèi)ゲ榭罩?’’)列,則使用 =’’。

建議查詢方式:NULL值查詢使用is null/is not null查詢,而空值(’’)可以使用=或者!=、<、>等算術(shù)運算符。

3、COUNT 和 IFNULL函數(shù)

使用COUNT函數(shù):

mysql> SELECT count(one) FROM tb_test;
+------------+
| count(one) |
+------------+
|          3 |
+------------+
1 row in set

mysql> SELECT count(two) FROM tb_test;
+------------+
| count(two) |
+------------+
|          2 |
+------------+
1 row in set

mysql> SELECT count(*) FROM tb_test;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set

使用IFNULL函數(shù):

mysql> SELECT IFNULL(one,111111111) from tb_test WHERE one = '';
+-----------------------+
| IFNULL(one,111111111) |
+-----------------------+
|                       |
+-----------------------+
1 row in set

mysql> SELECT IFNULL(two,11111111) from tb_test where two is NULL;
+----------------------+
| IFNULL(two,11111111) |
+----------------------+
| 11111111             |
+----------------------+
1 row in set

小結(jié):使用 COUNT(字段) 統(tǒng)計會過濾掉 NULL 值,但是不會過濾掉空值。

說明:

IFNULL有兩個參數(shù)。如果第一個參數(shù)字段不是NULL,則返回第一個字段的值。

否則,IFNULL函數(shù)返回第二個參數(shù)的值(默認值)。

4、索引字段說明

看到網(wǎng)上有一些人說: MySql中如果某一列中含有NULL,那么包含該列的索引就無效了。

一個普通索引,一個復(fù)合索引。

復(fù)合索引遵守“最左前綴”原則,即在查詢條件中使用了復(fù)合索引的第一個字段,索引才會被使用。因此,在復(fù)合索引中索引列的順序至關(guān)重要。

-- ALTER TABLE table_name ADD INDEX index_name(col_name);
ALTER TABLE tb_test ADD INDEX index_oat (one, two);
ALTER TABLE tb_test add INDEX index_two(two);

使用 show keys from 表名;或show indexes from 表名; ,查看這個表的所有索引信息。

復(fù)合索引

普通索引

發(fā)現(xiàn)查詢two字段 是可以正常使用索引的。我使用的MYSQL 5.7 ,InnoDB 引擎。MySQL可以在含有null的列上使用索引。可能是其他條件下不行。

小結(jié):在有NULL值得字段上使用常用的索引,如普通索引、復(fù)合索引、全文索引等不會使索引失效。在官網(wǎng)查看在空間索引的情況下,說明了 索引列必須為NOT NULL。

附官網(wǎng)查看

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • windows2008 64位系統(tǒng)下MySQL 5.7綠色版的安裝教程

    windows2008 64位系統(tǒng)下MySQL 5.7綠色版的安裝教程

    這篇文章主要給大家分享了在windows2008 64位系統(tǒng)下MySQL 5.7綠色版的安裝教程,文中將安裝步驟介紹的非常詳細,相信會對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • mysql觸發(fā)器同步表的數(shù)據(jù)方式

    mysql觸發(fā)器同步表的數(shù)據(jù)方式

    這篇文章主要介紹了mysql觸發(fā)器同步表的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • linux采用binary方式安裝mysql

    linux采用binary方式安裝mysql

    這篇文章主要為大家詳細介紹了linux采用binary方式安裝mysql步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • MySQL之表碎片化的問題解決

    MySQL之表碎片化的問題解決

    MySQL數(shù)據(jù)庫的碎片是由于頻繁的增刪改查操作導(dǎo)致的數(shù)據(jù)塊不連續(xù)或不規(guī)則分布,本文主要介紹了MySQL之表碎片化的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • Python版Mysql爆破小腳本

    Python版Mysql爆破小腳本

    本文給大家分享的是使用Python制作的MySQL在線用戶密碼的暴力破解腳本,非常的好用,有需要的小伙伴可以參考下
    2016-10-10
  • MySQL重啟之后無法寫入數(shù)據(jù)的問題排查及解決

    MySQL重啟之后無法寫入數(shù)據(jù)的問題排查及解決

    客戶在給系統(tǒng)打補丁之后需要重啟服務(wù)器,數(shù)據(jù)庫在重啟之后,read_only 的設(shè)置與標準配置 文件中不一致,導(dǎo)致主庫在啟動之后無法按照預(yù)期寫入,所以本文給大家介紹了MySQL重啟之后無法寫入數(shù)據(jù)的問題排查及解決,需要的朋友可以參考下
    2024-05-05
  • MySql忘記密碼修改方式適應(yīng)5.7以上版本

    MySql忘記密碼修改方式適應(yīng)5.7以上版本

    這篇文章主要介紹了MySql忘記密碼修改方式適應(yīng)5.7以上版本,需要的朋友可以參考下
    2017-06-06
  • MySQL監(jiān)控Innodb信息工作流程

    MySQL監(jiān)控Innodb信息工作流程

    這篇文章主要為大家介紹了MySQL監(jiān)控Innodb信息工作流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-02-02
  • Windows下mysql?8.0.28?安裝配置方法圖文教程

    Windows下mysql?8.0.28?安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了Windows下mysql?8.0.28?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • mysql導(dǎo)入導(dǎo)出數(shù)據(jù)中文亂碼解決方法小結(jié)

    mysql導(dǎo)入導(dǎo)出數(shù)據(jù)中文亂碼解決方法小結(jié)

    本文章總結(jié)了mysql導(dǎo)入導(dǎo)出數(shù)據(jù)中文亂碼解決方法,出現(xiàn)中文亂碼一般情況是導(dǎo)入導(dǎo)入時編碼的設(shè)置問題,我們只要把編碼調(diào)整一致即可解決此方法,下面是搜索到的一些方法總結(jié),方便需要的朋友
    2012-10-10

最新評論