對於mysql中資料為NULL引發的一些問題和思考

2021-10-19 09:04:47 字數 4024 閱讀 9961

首先建立測試表

create table `temp_person` (`id` int not null auto_increment,`name` varchar(5) collate utf8mb4_bin default null,`phone` varchar(20) collate utf8mb4_bin default null,primary key (`id`)) engine=innodb default charset=utf8mb4 collate=utf8mb4_bin;
填充測試資料

insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (1, '張三', '159***001');insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (2, '李四', '159***002');insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (3, '王五', '159***003');insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (4, '馬六', '159***004');insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (5, '王一', '159***005');insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (6, '王二', '159***006');insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (7, '', '159***007');insert into `mz_order`.`temp_person`(`id`, `name`, `phone`) values (8, null, '159***008');
查一下資料

問題1:count資料

select count(1),count(id),count(`name`),count(phone) from temp_person;
執行結果如下:

結論:當某列存在null值時,例如name列可能會有空值,使用count(name)會丟失資料。

解決方案:當需要使用count時,可以使用count(1)或count(主鍵)進行統計。

問題2:distinct 資料

selectcount( distinct `name`, phone ),count( distinct phone, `name` )fromtemp_person;
執行結果如下:

第二列也不存重複值,實際列為8,但查詢結果為7。

結論:當使用count(distinct 列1,列2)查詢時,如果其中一列(不分順序)為null,那麼即使另一列有值,查詢結果也會丟失。

問題3:select資料

查詢非等於 <>或!=,會導致資料為null值的結果丟失。

select*fromtemp_personwhere `name`<>'張三'
例如:查詢出名字不等於'張三'的資料

執行結果如下:

結論:使用非等於,會使資料為null的資料丟失。

解決方法:只需要在查詢結果後面加上為null值的結果即可。執行sql如下:

select*fromtemp_personwhere `name`!='張三'or isnull(`name`)

問題4:空指標異常

如果某列存在null值,可能會導致sum(column)的返回結果為null,而非0.

改造測試表,增加列age。

alter table `mz_order`.`temp_person`add column `age` smallint(6) null comment '年齡' after `phone`;
手動賦值

開始查詢

結論:當查詢的資料為null時,使用sum函式會返回null而不是0,就可能會導致程式空指標。

解決方法:增加判空即可

問題5:查詢如果某列為空給預設值

場景:比如說傳輸資料,需要name不為空的資料傳輸過去。如果name為空,則給乙個預設值。

例如:

select`name` as '原始資料',ifnull( name, '預設' ) as name1,if( name is null, '預設', name ) as name2 ,if(name='','預設',name) as name3fromtemp_person;
可以發現,列出的3種方式對於null或空都會存在空值,那麼如何避免呢?

解決方法:

select`name` as '原始資料',ifnull( if ( `name` = '', '預設', `name` ), '預設' ) as name1fromtemp_person;

MySQL中對於NULL值的理解和使用教程

null值的概念是造成sql的新手的混淆的普遍原因,他們經常認為null是和乙個空字串 的一樣的東西。不是這樣的!例如,下列語句是完全不同的 mysql insert into my table phone values null mysql insert into my table phone v...

mysql 判斷字段是否為null

sql中有isnull方法,介紹如下 isnull 使用指定的替換值替換 null。語法isnull check expression replacement value 引數check expression 將被檢查是否為 null的表示式。check expression 可以是任何型別的。re...

Mysql中的sum函式為null時的解決辦法

在mysql中sum函式查出的最終結果為0的時候會顯示null,這時候就需要將null轉為0 方法1 使用ifnull expr1,expr2 函式 select ifnull sum ss 0.0 as sum from fd order fo2 where fo2.buyer id 11 結果為...