当前位置: 代码网 > it编程>数据库>Mysql > mysql数据NULL避坑指南分享

mysql数据NULL避坑指南分享

2024年05月26日 Mysql 我要评论
null空值是mysql中一种特殊的数据值(即"缺少的未知值"),null和字符串空值不是一回事,处理null与其他值不同,下面具体阐述相关差异:一、null运算符1、普通数据普通

null空值是mysql中一种特殊的数据值(即"缺少的未知值"),null和字符串空值不是一回事,处理null与其他值不同,下面具体阐述相关差异:

一、null运算符

1、普通数据

普通数据使用 > 、< 、=即可做常用的逻辑运算如下:

select  1>2, 1<2 ,1=2,1<>2;

执行结果:

如果使用 > 、< 、= 对null进行运算,那么会是什么结果

select  1>null, 1<null,1=null,1<>null;

执行结果:

通过实验结果可知,正常的 > < = 是无法对null就行运算操作的,因此在日常开发中,如果使用一个null值做> < 过滤查询,过滤条件将无法生效,接下来具体研究null的运算符。

2、 is null 和 is not null

对于null的运算mysql提供了is null 、is not null函数进行处理

 select  null  is null , null  is not null, 1 is null, 1 is not null;

二、null 查询优化

对于某列字段存在大量null值,而此列字段不得不加索引,那么使用 is null 、is not null 可以提高查询效率。

创建一张t_staff表:

create table `t_staff11`  (
  `staff_no` varchar(30)  comment '职工号',
  `staff_name` varchar(10) comment '职工姓名',
  `staff_sex` char(1)  comment '性别(1男,2女)',
  `password` varchar(255)  comment '密码',
  `update_time` datetime(0)  comment '更新时间',
  `status` char(1)  default '0' comment '帐号状态(0正常 1停用)',
  `del_flag` char(1)  default '0' comment '删除标志(0代表存在 2代表删除)',
  `balance` decimal(10, 2)  comment '卡余额'
) engine = innodb character set = utf8mb4; 

插入测试数据:

insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (71, '韩杰', null, 'a5646cc4c84c996ca6620e7d403d6666', null, null, '0', 1439.20);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (113, '高秀丽', null, '82ad07da3d6a7a22d443aa7bd646910d', null, null, '0', 20.03);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (121, '范嵘', null, 'fb207643a9ea6f52b3664f9ecf99bc0a', '2020-07-08 07:30:49', null, '0', 673.05);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (160, '马春霞', null, 'fa348453e2bebb83452bbd0a304f57ae', null, null, '0', 196.20);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (161, '何爱莲', '1', '9a236449276f8218a8ac5f5b9b194fd0', null, null, '0', 380.19);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (171, '冯文静', '1', '414781c1fca2da7e682176aa5849ee2f', null, null, '0', 490.17);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (175, '许春景', '2', '2b32513984f4bb87a9f8c3270bc1d271', null, null, '0', 415.10);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (181, '王方', '2', '23dea74889375b09b46f41639559164e', '2020-07-09 09:20:12', null, '0', 14.80);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (182, '刘瑞雪', null, 'ef3c90bbd1366194c5f6760b1e832616', null, null, '0', 595.40);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (218, '陆寓非', null, '31ad4cf6368c8b04edded92d660e105f', null, null, '0', 573.30);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (227, '安凤伟', null, 'c84d9c929ffe7810470952deccd0f9d8', null, null, '0', 1412.90);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (234, '张丽', null, 'da2e045d2c028960b6f4e4712635032c', null, null, '0', 381.03);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (267, '沈彩霞', null, '0f984f9f5fe54eed031fa6079aa27307', null, null, '0', 3252.77);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (289, '王东梅', null, 'c6666174b32e7555a9557800721d35c7', null, null, '0', 240.46);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (333, '邹梅', null, 'c8acdc2e4824cbf6ac51a7ea76f1f2e6', null, null, '0', 2223.70);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (339, '董蓓', null, '009c26ababd97b0cdb8f277d8c20beee', null, null, '0', 526.90);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (361, '罗素霞', null, '2a089e222d3547b7b60eef4810488f59', null, null, '0', 2941.00);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (366, '赵艳秋', null, '848b0d4e401ceb2d4b01ce74ca5c2b65', null, null, '0', 1331.91);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (372, '王玉琴', null, 'c7453dbe0269a3ae79ba5094f66d050d', null, null, '0', 3139.20);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (388, '张艳玲', null, '2336b05aef2565f62afeba502e545358', null, null, '0', 602.45);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (390, '郭艳璟', null, 'b2f8c3fab16fb554887621e46365862e', '2020-05-19 21:04:25', null, '0', 5.50);
insert into`t_staff`(`staff_no`, `staff_name`, `staff_sex`, `password`, `update_time`, `status`, `del_flag`, `balance`) values (392, '王丽', null, 'bf3925cd423c9dc6a911fa32772e4e70', null, null, '0', 254.79);

由于satf_sex字段存在大两空值,在其列加索引

alter  table  t_staff  add  index  sexindex(staff_sex);

查询staff_sex为1的数据;

1、普通等号(=)查询

explain  select  *  from  t_staff where staff_sex =1;

执行结果如下:

明明在staff_sex列加索引了,为啥不走索引全表扫描呢,这就就null搞的鬼。

2、is not null 查询

explain  select  *  from  t_staff where  staff_sex is not null  and  staff_sex =1;

查看执行结果:

这一次查询索引生效,大大的提高查询效率。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com