MySQL字段为NULL的坑有哪些
时间:2024-10-26 21:20 文章来源于网友投稿,仅供参考!
正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如下图所示: “兵马未动粮草先行”,看完了相关的配置之后,我们先来创建一张测试表和一些测试数据。 --如果存在person表先删除DROPTABLEIFEXISTSperson;--创建person表,其中username字段可为空,并为其设置普通索引CREATETABLEperson(idINTPRIMARYKEYauto_increment,nameVARCHAR(20),mobileVARCHAR(13),index(name))ENGINE='innodb';--person表添加测试数据insertintoperson(name,mobile)values('Java','13333333330'),('MySQL','13333333331'),('Redis','13333333332'),('Kafka','13333333333'),('Spring','13333333334'),('MyBatis','13333333335'),('RabbitMQ','13333333336'),('Golang','13333333337'),(NULL,'13333333338'),(NULL,'13333333339');select*fromperson;构建的测试数据,如下图所示: 有了数据之后,我们就来看当列中存在 当某列存在 selectcount(*),count(name)fromperson; 查询执行结果如下: 从上述结果可以看出,当使用的是 解决方案 如果某列存在 扩展知识:不要使用 count(常量) 2.distinct 数据丢失 当使用 selectcount(distinctname,mobile)fromperson; 查询执行结果如下: 数据库的原始数据如下: 从上述结果可以看出手机号一列的 10 条数据都是不同的,但查询的结果却为 8。 3.select 数据丢失如果某列存在 我需要查询除 name 等于“Java”以外的所有数据,预期返回的结果是 id 从 2 到 10 的数据,但当执行以下查询时: select*frompersonwherename<>'Java'orderbyid;--或select*frompersonwherename!='Java'orderbyid; 查询结果均为以下内容: 可以看出为 解决方案 要解决以上的问题,只需要在查询结果中拼加上为 select*frompersonwherename<>'Java'orisnull(name)orderbyid; 最终的执行结果如下: 4.导致空指针异常如果某列存在 首先,我们先构建一张表和一些测试数据: --如果存在goods表先删除DROPTABLEIFEXISTSgoods;--创建goods表CREATETABLEgoods(idINTPRIMARYKEYauto_increment,numint)ENGINE='innodb';--goods表添加测试数据insertintogoods(num)values(3),(6),(6),(NULL);select*fromgoods; 表中原始数据如下: 接下来我们使用 selectsum(num)fromgoodswhereid>4; 查询执行结果如下: 当查询的结果为 解决空指针异常 可以使用以下方式来避免空指针异常: selectifnull(sum(num),0)fromgoodswhereid>4; 查询执行结果如下: 5.增加了查询难度当某列值中有 所谓的查询难度增加指的是当进行 还是以 错误用法 1: select*frompersonwherename<>null; 执行结果为空,并没有查询到任何数据,如下图所示: 错误用法 2: select*frompersonwherename!=null; 执行结果也为空,没有查询到任何数据,如下图所示: 正确用法 1: select*frompersonwherenameisnotnull; 执行结果如下: 正确用法 2: select*frompersonwhere!isnull(name); 执行结果如下: 扩展知识:NULL 不会影响索引细心的朋友可能发现了,我在创建 然后我们用
从上述结果可以看出,即使 |