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

吾爱主题 阅读:159 2024-04-02 08:01:01 评论:0

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

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

?
1 2 3 4 5 6 7 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字段没有添加这个约束,然后我们先插入一部分数据,如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 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    | + ----+------+-------+ rows  in  set  (0.00 sec)

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

?
1 select * from test where id != 2;

我们查看结果:

?
1 2 3 4 5 6 7 8 9 10 11 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    | + ----+------+-------+ rows  in  set  (0.00 sec)

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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    | + ----+------+-------+ rows  in  set  (0.00 sec)

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

?
1 2 3 4 5 6 7 8 9 10 11 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    | + ----+------+-------+ rows  in  set  (0.00 sec)

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

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

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

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

原文链接:https://mp.weixin.qq.com/s/rzMVf4JJktHeOSKJG6QWBw

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容