Mysql数据NULL避坑指南

news/2024/12/1 20:41:37/

        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、对NULL列使用 IS NOT NULL 查询:

EXPLAIN  SELECT  *  FROM  t_staff WHERE  staff_sex IS NOT NULL  AND  staff_sex =1;

          查看执行结果:

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


http://www.ppmy.cn/news/745485.html

相关文章

泰迪智能科技基于产业技能生态链学生学徒制的双创工作室--促进学生高质量就业

据悉&#xff0c;6月28日&#xff0c;广东省人力资源和社会保障厅在广东岭南现代技师学院举行广东省“产教评”技能生态链建设对接活动。该活动以“新培养、新就业、新动能”为主题&#xff0c;总结推广“产教评”技能人才培养新模式&#xff0c;推行“岗位培养”学徒就业新形式…

怎样进入pe重建硬盘

怎样进入pe重建硬盘&#xff0c;一起来了解一下如何进入pe重建硬盘吧。 同时按住winR键打开运行窗口&#xff0c;在运行窗口中输入control&#xff0c;点击确定。 打开控制面板后点击索引选项。 在索引选项界面&#xff0c;点击高级。 点击重建&#xff0c;确定即可。 win7…

pe如何查看计算机用户名,用PE如何查看系统版本

最佳答案 如下参考&#xff1a; 1、Windows 各系统版本号区别&#xff1a; Win 2000 5.0 Win XP 5.1 Win7 6.1 Win8/8.1 6.2/6.3 Win10 10.0 其实知道系统是Win8.1就可以了&#xff0c;直接用原版系统盘进行修复即可。至于具体的内部版本号&#xff0c;可以查看系统文件属性来获…

pe下找不到ssd硬盘_进入PE系统之后找不到固态硬盘

展开全部 PE版本太低&#xff0c;不识别62616964757a686964616fe59b9ee7ad9431333366303734固态硬盘。更新新版PE启动系统。 这里以U深度U盘启动制作为例&#xff1a; 1、在电脑下载安装u深度u盘启动盘制作工具。打开下载好的安装包&#xff0c;点击窗口中立即安装。 2、等待安…

st58服务器装系统,微pe硬盘安装系统教程

微pe硬盘安装系统教程 [2021-02-19 05:17:36] 简介: php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff…

pe里怎么看不到计算机硬盘,进去pe系统找不到硬盘怎么回事_进入pe系统看不到硬盘如何解决-win7之家...

pe系统是一种装系统的系统,也就是预装系统的系统,它是一种系统预装环境和工具,我们要安装系统的时候,经常会需要进入pe系统来进行一些操作,然而有不少用户在进去pe系统之后,却找不到硬盘,这是怎么回事呢,经过分析可能是使用的pe系统所带有的驱动器没有更新,下面给大家…

微pe不识别nvme固态硬盘_微pe工具箱2.0下载|微PE2.0支持注入NVMe固态硬盘M2SSD驱动版 下载_当游网...

微PE2.0是一款电脑WinPE系统安装软件,该工具有着最为干净的内核并且毫无捆绑内容,2.0版本更新加入了.M2接口NVME硬件支持,快下载体验吧! 软件介绍 WinPE工具箱,装机维护最得力的助手,最后救命稻草。化繁为简,小材大用,一键安装,极速启动。微PE工具箱,最好用的PE工具箱…

笔记本进入pe却看不到计算机硬盘,11代cpu笔记本进pe看不到硬盘解决方法(PE完美解决)...

最近有网友问刚购买的11代cpu笔记本为什么进入pe后看不到硬盘?并且采用的比较新的win10 pe也无法看到硬盘?并且bios中也没有相关硬盘模式的选择项,研究后发现是由于intel 新技术VMD默认开启了,只有将VMD关闭后才能设置相关的硬盘模式,下面小编就给大家介绍详细的操作步骤。…