• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL中关于null值的一个小问题

        今天在测试null值的时候,发现了一个小问题,记录在这里,不知道大家以前遇到过没。

        事情发展是这样的,在过滤一个表中的数值的时候,需要把age=2的列给剔除掉,然后查看剩余的列信息,这个操作看起来比较简单,我用一个表模拟一下过程:

    CREATE TABLE `test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `age` int(11) DEFAULT NULL,
      `score` varchar(20) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `idx_score` (`score`)
    ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

      表结构如上,其中id和score都加了not null的限制,而age字段没有添加这个约束,然后我们先插入一部分数据,如下:

    mysql:yeyztest 23:32:57>>select * from test;
    +----+------+-------+
    | id | age  | score |
    +----+------+-------+
    |  1 |    1 | 5     |
    |  2 |    2 | 10    |
    |  5 |    5 | 25    |
    |  8 |    8 | 40    |
    |  9 |    2 | 45    |
    | 10 |    5 | 50    |
    | 11 |    8 | 55    |
    +----+------+-------+
    7 rows in set (0.00 sec)

       当前这组数据是全量的,每个字段都有值,然后我们使用下面的SQL语句来查询制定记录:

    select * from test where id != 2;

    我们查看结果:

    mysql:yeyztest 23:33:14>>select * from test where age!=2;
    +----+------+-------+
    | id | age  | score |
    +----+------+-------+
    |  1 |    1 | 5     |
    |  5 |    5 | 25    |
    |  8 |    8 | 40    |
    | 10 |    5 | 50    |
    | 11 |    8 | 55    |
    +----+------+-------+
    5 rows in set (0.00 sec)

    此时我们插入两条记录进去:

    mysql:yeyztest 23:33:17>>insert into test (id,score) values (12,60);
    Query OK, 1 row affected (0.00 sec)
    
    mysql:yeyztest 23:34:02>>insert into test (id,score) values (13,65);
    Query OK, 1 row affected (0.00 sec)
    
    mysql:yeyztest 23:34:10>>select * from test;
    +----+------+-------+
    | id | age  | score |
    +----+------+-------+
    |  1 |    1 | 5     |
    |  2 |    2 | 10    |
    |  5 |    5 | 25    |
    |  8 |    8 | 40    |
    |  9 |    2 | 45    |
    | 10 |    5 | 50    |
    | 11 |    8 | 55    |
    | 12 | NULL | 60    |
    | 13 | NULL | 65    |
    +----+------+-------+
    9 rows in set (0.00 sec)

    再次使用上面的语句进行查询,可以看到结果如下:

    mysql:yeyztest 23:34:15>>select * from test where age!=2;
    +----+------+-------+
    | id | age  | score |
    +----+------+-------+
    |  1 |    1 | 5     |
    |  5 |    5 | 25    |
    |  8 |    8 | 40    |
    | 10 |    5 | 50    |
    | 11 |    8 | 55    |
    +----+------+-------+
    5 rows in set (0.00 sec)

       也就是说,当记录中包含null值的时候,使用反向匹配age!=2是无法得到全量的查询结果的,这明显不符合我们的预期。

       其实这个问题,在之前的文章中有说到过,就是在一条数据记录里面,null值字段和一般的字段是不在一起存储的,null值字段是存储在null值列表里面的。所以造成了检索时候不匹配的现象,这个还是比较重要的一个点,希望对大家有用。

       声明一下,测试环境是5.7.16版本的MySQL。

    以上就是MySQL中关于null值的一个小问题的详细内容,更多关于MySQL null值的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • 为什么mysql字段要使用NOT NULL
    • MySQL null的一些易错点
    • MySQL null与not null和null与空值''''''''的区别详解
    • MySQL IFNULL判空问题解决方案
    • 区分MySQL中的空值(null)和空字符('''')
    • 详解mysql不等于null和等于null的写法
    • Mysql NULL导致的神坑
    • mysql中null(IFNULL,COALESCE和NULLIF)相关知识点总结
    • 详解mysql三值逻辑与NULL
    上一篇:Mysql隔离性之Read View的用法说明
    下一篇:导致MySQL做全表扫描的几种情况
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL中关于null值的一个小问题 MySQL,中,关于,null,值,的,