mysql数据NULL避坑指南分享

 更新时间:2024年05月01日 09:00:53   作者:fengchengwu2012  
这篇文章主要介绍了mysql数据NULL避坑指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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;

查看执行结果:

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL在右表数据不唯一的情况下使用left join的方法

    MySQL在右表数据不唯一的情况下使用left join的方法

    这篇文章主要介绍了MySQL在右表数据不唯一的情况下使用left join的方法,针对右表符合条件表达式的记录数大于1条时left join所显示的结果需求来讲,需要的朋友可以参考下
    2016-03-03
  • MYSQL IN 与 EXISTS 的优化示例介绍

    MYSQL IN 与 EXISTS 的优化示例介绍

    当B表的数据集必须小于A表的数据集时,用in优于exists,当A表的数据集系小于B表的数据集时,用exists优于in
    2014-08-08
  • 详解mysql DML语句的使用

    详解mysql DML语句的使用

    这篇文章主要介绍了详解mysql DML语句的使用,帮助大家更好的理解和学习mysql,感兴趣的朋友可以了解下
    2020-08-08
  • mysql 搜寻附近N公里内数据的简单实例

    mysql 搜寻附近N公里内数据的简单实例

    下面小编就为大家带来一篇mysql 搜寻附近N公里内数据的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • MySQL如何选择合适的索引

    MySQL如何选择合适的索引

    这篇文章主要介绍了MySQL如何选择合适的索引,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • MySQL切分函数substring()的具体使用

    MySQL切分函数substring()的具体使用

    这篇文章主要介绍了MySQL切分函数substring()的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • mysql 5.7.10 安装配置方法图文教程

    mysql 5.7.10 安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.7.10 安装配置方法图文教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • MySQL深分页问题解决的实战记录

    MySQL深分页问题解决的实战记录

    优化项目代码过程中发现一个千万级数据深分页问题,觉着有必要给大家总结整理下,这篇文章主要给大家介绍了关于解决MySQL深分页问题的相关资料,需要的朋友可以参考下
    2021-09-09
  • mysql 维护常用命令

    mysql 维护常用命令

    需要维护mysql数据库的朋友可以参考下。
    2009-11-11
  • 关于mysql数据库连接编码问题

    关于mysql数据库连接编码问题

    这篇文章主要介绍了关于mysql数据库连接编码问题,默认的编码和数据库表中的数据使用的编码是不一致的,如果是中文,那么在数据库中执行时已经是乱码了,需要的朋友可以参考下
    2023-04-04

最新评论