一文带你探究MySQL中的NULL

目录
  • 前言
  • 1 mysql 中的null
  • 2 null占用的长度
  • 3 对null值的比较
  • 4 sql对null值进行处理
  • 5 值为null 对查询条件的影响
  • 6 值为null对索引的影响
  • 7 值为null对排序的影响
  • 8 null和空值区别
  • 总结

前言

不知道大家有没有遇到这样的问题,当我们在对mysql数据库进行查询操作时,条件写的是status!=1,理论上会将所有不符合条件的查询出来,但奇怪的是结果为null的就查不出来,必须得拼接上条件or status is null。本篇文章我们就一起探究一下mysql中的null。

1 mysql 中的null

对mysql来说,null是一个特殊的值。

null表示不可知不确定,null不与任何值相等(包括其本身)

2 null占用的长度

null在数据库中占用的长度

mysql>  select length(null), length(''), length('1');
+--------------+------------+-------------+
| length(null) | length('') | length('1') |
+--------------+------------+-------------+
| null         |          0 |           1 |
+--------------+------------+-------------+

null columns require additional space in the row to record whether their values are null.

可以看出空值”的长度是0,是不占用空间的;而的null长度是null,是需要占用额外空间的,所以在一些开发规范中,建议将数据库字段设置为not null,并且设置默认值”或0。

3 对null值的比较

is null 判断某个字符是否为空,并不代表空字符或者是0

sql92标准中说道,!=null 条件判断永远返回false,聚合运算永远返回0

当然在数据库中可以使用set ansi_nulls off关闭标准模式,但一般不建议这样去做

所以,要判断一个数是否等于null只能用 is null 或者 is not null 来判断

4 sql对null值进行处理

mysql中专门为我们提供了ifnull(expr1,expr2)这个函数,让我们可以轻松的处理数据中的null

ifnull有两个参数。 如果第一个参数字段不是null,则返回第一个字段的值。 否则,ifnull函数返回第二个参数的值(默认值)。

select ifnull(status,0) from t_user;

5 值为null 对查询条件的影响

  • 不能使用=,<,>这样的运算符,对null做算术运算的结果都是null(所以说当status为null时,status!=1不会统计到null)
  • 使用count(expr) 统计时,也不会统计该字段为null的数据

6 值为null对索引的影响

首先需要注意的一点是,mysql中某一列数据含有null,并不一定会造成索引失效。

mysql可以在含有null的列上使用索引

在有null值得字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。但是在使用空间索引的情况下,该列就必须为 not null。

7 值为null对排序的影响

在order by排序的时候,如果存在null值,那么null是最小的,asc正序排序的话,null值是在最前面的

如果我们需要在正序排序时,将null值放在后边,这里我们就需要巧借is null

select * from t_user order by age is null, age; 
或者
select * from t_user order by isnull(name), age; 
# 等价于
select * from (select name, age, (age is null) as isnull from t_user) as foo order by isnull, age; 

8 null和空值区别

null也就是在字段中存储null值,空值也就是字段中存储空字符(”)。

1、占用空间区别

mysql>  select length(null), length(''), length('1');
+--------------+------------+-------------+
| length(null) | length('') | length('1') |
+--------------+------------+-------------+
| null         |          0 |           1 |
+--------------+------------+-------------+
1 row in set

小总结:从上面看出空值(”)的长度是0,是不占用空间的;而的null长度是null,其实它是占用空间的,看下面说明。

null columns require additional space in the row to record whether their values are null.

null列需要行中的额外空间来记录它们的值是否为null。

通俗的讲:空值就像是一个真空转态杯子,什么都没有,而null值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别。

总结

到此这篇关于mysql中null的文章就介绍到这了,更多相关mysql中的null内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐