首先建立測試表
填充測試資料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 資料
執行結果如下:select
count( distinct `name`, phone ),
count( distinct phone, `name` )
from
temp_person;
第二列也不存重複值,實際列為8,但查詢結果為7。
結論:當使用count(distinct 列1,列2)查詢時,如果其中一列(不分順序)為null,那麼即使另一列有值,查詢結果也會丟失。
問題3:select資料
查詢非等於 <>或!=,會導致資料為null值的結果丟失。
例如:查詢出名字不等於'張三'的資料select
*
from
temp_person
where `name`<>'張三'
執行結果如下:
結論:使用非等於,會使資料為null的資料丟失。
解決方法:只需要在查詢結果後面加上為null值的結果即可。執行sql如下:
select
*
from
temp_person
where `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為空,則給乙個預設值。
例如:
可以發現,列出的3種方式對於null或空都會存在空值,那麼如何避免呢?select
`name` as '原始資料',
ifnull( name, '預設' ) as name1,
if( name is null, '預設', name ) as name2 ,
if(name='','預設',name) as name3
from
temp_person;
解決方法:
select
`name` as '原始資料',
ifnull( if ( `name` = '', '預設', `name` ), '預設' ) as name1
from
temp_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 結果為...