最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql NULL導(dǎo)致的神坑

 更新時間:2020年09月21日 10:37:27   作者:易兮科技  
這篇文章主要介紹了Mysql NULL導(dǎo)致的神坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

比較運算符中使用NULL

mysql> select 1>NULL;
+--------+
| 1>NULL |
+--------+
|  NULL |
+--------+
1 row in set (0.00 sec)

mysql> select 1<NULL;
+--------+
| 1<NULL |
+--------+
|  NULL |
+--------+
1 row in set (0.00 sec)

mysql> select 1<>NULL;
+---------+
| 1<>NULL |
+---------+
|  NULL |
+---------+
1 row in set (0.00 sec)

mysql> select 1>NULL;
+--------+
| 1>NULL |
+--------+
|  NULL |
+--------+
1 row in set (0.00 sec)

mysql> select 1<NULL;
+--------+
| 1<NULL |
+--------+
|  NULL |
+--------+
1 row in set (0.00 sec)

mysql> select 1>=NULL;
+---------+
| 1>=NULL |
+---------+
|  NULL |
+---------+
1 row in set (0.00 sec)

mysql> select 1<=NULL;
+---------+
| 1<=NULL |
+---------+
|  NULL |
+---------+
1 row in set (0.00 sec)

mysql> select 1!=NULL;
+---------+
| 1!=NULL |
+---------+
|  NULL |
+---------+
1 row in set (0.00 sec)

mysql> select 1<>NULL;
+---------+
| 1<>NULL |
+---------+
|  NULL |
+---------+
1 row in set (0.00 sec)

mysql> select NULL=NULL,NULL!=NULL;
+-----------+------------+
| NULL=NULL | NULL!=NULL |
+-----------+------------+
|   NULL |    NULL |
+-----------+------------+
1 row in set (0.00 sec)

mysql> select 1 in (null),1 not in (null),null in (null),null not in (null);
+-------------+-----------------+----------------+--------------------+
| 1 in (null) | 1 not in (null) | null in (null) | null not in (null) |
+-------------+-----------------+----------------+--------------------+
|    NULL |      NULL |      NULL |        NULL |
+-------------+-----------------+----------------+--------------------+
1 row in set (0.00 sec)

mysql> select 1=any(select null),null=any(select null);
+--------------------+-----------------------+
| 1=any(select null) | null=any(select null) |
+--------------------+-----------------------+
|        NULL |         NULL |
+--------------------+-----------------------+
1 row in set (0.00 sec)

mysql> select 1=all(select null),null=all(select null);
+--------------------+-----------------------+
| 1=all(select null) | null=all(select null) |
+--------------------+-----------------------+
|        NULL |         NULL |
+--------------------+-----------------------+
1 row in set (0.00 sec)

結(jié)論:任何值和NULL使用運算符(>、<、>=、<=、!=、<>)或者(in、not in、any/some、all)比較時,返回值都為NULL,NULL作為布爾值的時候,不為1也不為0。

準(zhǔn)備數(shù)據(jù)

mysql> create table test1(a int,b int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test1 values (1,1),(1,null),(null,null);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from test1;
+------+------+
| a  | b  |
+------+------+
|  1 |  1 |
|  1 | NULL |
| NULL | NULL |
+------+------+
3 rows in set (0.00 sec)

上面3條數(shù)據(jù),認(rèn)真看一下,特別是注意上面NULL的記錄。

IN、NOT IN和NULL比較

IN和NULL比較

mysql> select * from test1;
+------+------+
| a  | b  |
+------+------+
|  1 |  1 |
|  1 | NULL |
| NULL | NULL |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from test1 where a in (null);
Empty set (0.00 sec)

mysql> select * from test1 where a in (null,1);
+------+------+
| a  | b  |
+------+------+
|  1 |  1 |
|  1 | NULL |
+------+------+
2 rows in set (0.00 sec)

 結(jié)論:當(dāng)IN和NULL比較時,無法查詢出為NULL的記錄。

NOT IN 和NULL比較

mysql> select * from test1 where a not in (1);
Empty set (0.00 sec)

mysql> select * from test1 where a not in (null);
Empty set (0.00 sec)

mysql> select * from test1 where a not in (null,2);
Empty set (0.00 sec)

mysql> select * from test1 where a not in (2);
+------+------+
| a  | b  |
+------+------+
|  1 |  1 |
|  1 | NULL |
+------+------+
2 rows in set (0.00 sec)

結(jié)論:當(dāng)NOT IN 后面有NULL值時,不論什么情況下,整個sql的查詢結(jié)果都為空。

EXISTS、NOT EXISTS和NULL比較

mysql> select * from test2;
+------+------+
| a  | b  |
+------+------+
|  1 |  1 |
|  1 | NULL |
| NULL | NULL |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from test1 t1 where exists (select * from test2 t2 where t1.a = t2.a);
+------+------+
| a  | b  |
+------+------+
|  1 |  1 |
|  1 | NULL |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from test1 t1 where not exists (select * from test2 t2 where t1.a = t2.a);
+------+------+
| a  | b  |
+------+------+
| NULL | NULL |
+------+------+
1 row in set (0.00 sec)

上面我們復(fù)制了表test1創(chuàng)建了表test2。

查詢語句中使用exists、not exists對比test1.a=test2.a,因為=不能比較NULL,結(jié)果和預(yù)期一致。

判斷NULL只能用IS NULL、IS NOT NULL

mysql> select 1 is not null;
+---------------+
| 1 is not null |
+---------------+
|       1 |
+---------------+
1 row in set (0.00 sec)

mysql> select 1 is null;
+-----------+
| 1 is null |
+-----------+
|     0 |
+-----------+
1 row in set (0.00 sec)

mysql> select null is null;
+--------------+
| null is null |
+--------------+
|      1 |
+--------------+
1 row in set (0.00 sec)

mysql> select null is not null;
+------------------+
| null is not null |
+------------------+
|        0 |
+------------------+
1 row in set (0.00 sec)

看上面的效果,返回的結(jié)果為1或者0。

結(jié)論:判斷是否為空只能用IS NULL、IS NOT NULL。

聚合函數(shù)中NULL的坑

示例

mysql> select count(a),count(b),count(*) from test1;
+----------+----------+----------+
| count(a) | count(b) | count(*) |
+----------+----------+----------+
|    2 |    1 |    3 |
+----------+----------+----------+
1 row in set (0.00 sec)
  • count(a)返回了2行記錄,a字段為NULL的沒有統(tǒng)計出來。
  • count(b)返回了1行記錄,為NULL的2行記錄沒有統(tǒng)計出來。
  • count(*)可以統(tǒng)計所有數(shù)據(jù),不論字段的數(shù)據(jù)是否為NULL。

再繼續(xù)看

mysql> select * from test1 where a is null;
+------+------+
| a  | b  |
+------+------+
| NULL | NULL |
+------+------+
1 row in set (0.00 sec)

mysql> select count(a) from test1 where a is null;
+----------+
| count(a) |
+----------+
|    0 |
+----------+
1 row in set (0.00 sec)

上面第1個sql使用is null查詢出了結(jié)果,第2個sql中count(a)返回的是0行。

結(jié)論:count(字段)無法統(tǒng)計字段為NULL的值,count(*)可以統(tǒng)計值為null的行。

NULL不能作為主鍵的值

mysql> create table test3(a int primary key,b int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test3 values (null,1);
ERROR 1048 (23000): Column 'a' cannot be null

上面我們創(chuàng)建了一個表test3,字段a未指定不能為空,插入了一條NULL的數(shù)據(jù),報錯原因:a 字段的值不能為NULL,我們看一下表的創(chuàng)建語句:

mysql> show create table test3;
+-------+------------+
| Table | Create Table   |
+-------+------------+
| test3 | CREATE TABLE `test3` (
 `a` int(11) NOT NULL,
 `b` int(11) DEFAULT NULL,
 PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
+-------+------------+
1 row in set (0.00 sec)

從上面的腳本可以看出,當(dāng)字段為主鍵的時候,字段會自動設(shè)置為not null。

結(jié)論:當(dāng)字段為主鍵的時候,字段會自動設(shè)置為not null。

看了上面這些還是比較暈,NULL的情況確實比較難以處理,容易出錯,最有效的方法就是避免使用NULL。所以,強(qiáng)烈建議創(chuàng)建字段的時候字段不允許為NULL,設(shè)置一個默認(rèn)值。

總結(jié)

  • NULL作為布爾值的時候,不為1也不為0
  • 任何值和NULL使用運算符(>、<、>=、<=、!=、<>)或者(in、not in、any/some、all),返回值都為NULL
  • 當(dāng)IN和NULL比較時,無法查詢出為NULL的記錄
  • 當(dāng)NOT IN 后面有NULL值時,不論什么情況下,整個sql的查詢結(jié)果都為空
  • 判斷是否為空只能用IS NULL、IS NOT NULL
  • count(字段)無法統(tǒng)計字段為NULL的值,count(*)可以統(tǒng)計值為null的行
  • 當(dāng)字段為主鍵的時候,字段會自動設(shè)置為not null
  • NULL導(dǎo)致的坑讓人防不勝防,強(qiáng)烈建議創(chuàng)建字段的時候字段不允許為NULL,給個默認(rèn)值

到此這篇關(guān)于Mysql NULL導(dǎo)致的神坑的文章就介紹到這了,更多相關(guān)Mysql NULL導(dǎo)致坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中的多個字段最大最小值

    mysql中的多個字段最大最小值

    這篇文章主要介紹了mysql中的多個字段最大最小值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • CMS不要讓MySQL為你流淚

    CMS不要讓MySQL為你流淚

    MySQL是中小型網(wǎng)站普遍使用的數(shù)據(jù)庫之一,然而,很多人并不清楚MySQL到底能支持多大的數(shù)據(jù)量,再加上某些國內(nèi)CMS廠商把數(shù)據(jù)承載量的責(zé)任推給它,導(dǎo)致很多不了解MySQL的站長對它產(chǎn)生了很多誤解
    2008-12-12
  • MySQL的InnoDB引擎入門學(xué)習(xí)教程

    MySQL的InnoDB引擎入門學(xué)習(xí)教程

    這篇文章主要介紹了MySQL的InnoDB引擎入門學(xué)習(xí)教程,對InnoDB的存儲結(jié)構(gòu)有一個較好的總結(jié),需要的朋友可以參考下
    2015-11-11
  • MySQL 多表關(guān)聯(lián)一對多查詢實現(xiàn)取最新一條數(shù)據(jù)的方法示例

    MySQL 多表關(guān)聯(lián)一對多查詢實現(xiàn)取最新一條數(shù)據(jù)的方法示例

    這篇文章主要介紹了MySQL 多表關(guān)聯(lián)一對多查詢實現(xiàn)取最新一條數(shù)據(jù)的方法,結(jié)合實例形式詳細(xì)分析了MySQL 多表關(guān)聯(lián)一對多查詢實現(xiàn)取最新一條數(shù)據(jù)相關(guān)原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • 基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫分離操作

    基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫分離操作

    這篇文章主要介紹了基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫分離操作,需要的朋友可以參考下
    2018-09-09
  • 用批處理實現(xiàn)自動備份和清理mysql數(shù)據(jù)庫的代碼

    用批處理實現(xiàn)自動備份和清理mysql數(shù)據(jù)庫的代碼

    有網(wǎng)友問我在win2003下如何自動備份MySQL數(shù)據(jù)庫,既然是自動備份,那肯定得寫腳本,當(dāng)然我們也可以利用軟件實現(xiàn)
    2013-08-08
  • 在C#和MySQL中存取中文字符時避免亂碼的方法

    在C#和MySQL中存取中文字符時避免亂碼的方法

    這篇文章主要介紹了在C#和MySQL中存取中文字符時避免亂碼的方法,主要還是老辦法先轉(zhuǎn)換成Unicode編碼,需要的朋友可以參考下
    2015-05-05
  • mysql 5.7.25 壓縮版安裝配置方法圖文教程

    mysql 5.7.25 壓縮版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.25 壓縮版安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • MySQL優(yōu)化方案參考

    MySQL優(yōu)化方案參考

    今天小編就為大家分享一篇關(guān)于MySQL優(yōu)化方案參考,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • 從MySQL復(fù)制功能中得到的一舉三得實惠分析

    從MySQL復(fù)制功能中得到的一舉三得實惠分析

    在MySQL數(shù)據(jù)庫中,支持單項、異步復(fù)制。在復(fù)制過程中,一個服務(wù)器充當(dāng)主服務(wù)器,而另外一臺服務(wù)器充當(dāng)從服務(wù)器。筆者通過MySQL的復(fù)制功能得到了一下實惠,在下文中與大家分享。
    2011-03-03

最新評論

武威市| 邳州市| 古田县| 漳平市| 名山县| 西丰县| 丽水市| 淄博市| 云南省| 平顺县| 永修县| 新安县| 禹州市| 建德市| 铁力市| 永和县| 星座| 塔城市| 布尔津县| 民勤县| 梁山县| 桓台县| 寻甸| 高阳县| 西吉县| 洛南县| 雷波县| 内黄县| 门源| 宁海县| 梓潼县| 常宁市| 商南县| 鸡东县| 新干县| 永寿县| 炎陵县| 贵定县| 盘锦市| 邛崃市| 天津市|