下面参考:

官方文档mysql 5.7


 

1.我们先探讨字段为NOT NULL情况下是否可以存储空值

首先来个例子:

MySQL处理空列 mysql空值的作用_MySQL处理空列

如图: 虽然字段是not null,但是可以存空值,并不能存NULL值

MySQL处理空列 mysql空值的作用_数据_02

小结:在字段为NOT NULL情况下可以存储空值,但是不能存储NULL值

通过上面可以得出在字段为not null值情况下,可以插入空值,但是不能插入NULL值,可是这是为什么?


下面我们就要查看空值和NULL值的定义

 

2.空值和NULL值的定义概念

1.空值是不占空间的

2.mysql中的null是占空间的

官方文档是这样解释的:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

通过上面概念我们可以总结出:

小结:空值是不占空间的,并没有破坏了字段为NOT NULL的定义,因此可以存储空值,但是NULL值存储是占空间的,因此不能进行存储.


 

因为空值和null值的定义,但是我们查询时如何正确区分出空值和null值还有很多细节问题应该如何区分

通过查阅官方文档我得出了几点概念:

1.NULL值与任何其他值相比都是不正确的,比较结果都为NULL,无法获取到实际意义.

2.如果需要搜索NULL值,不能写成 字段 = NULL,这样写不正确,可以使用 字段 = IS NULL或 字段 = ''空值

3.聚合函数,如COUNT(),MIN(),SUM()在进行查询时会忽略掉null值

例如:

MySQL处理空列 mysql空值的作用_字段_03

数据包含了空值和NULL值,我们进行聚合查询数量

执行语句: 

SELECT COUNT(*) , COUNT(B) , COUNT(C) FROM test1

结果:

MySQL处理空列 mysql空值的作用_null和空值区别_04

可以看出,聚合查询时将NULL值进行了忽略,而空值并没有被忽略.

 


 

如果说我现在需要查询字段数据B不为空的数据,我应该怎么查询

这里就引入了两种方法 

1.使用<>符号进行当做条件查询,<>符号为不等于

2.使用 IS NOT NULL进行查询

当然,这里就有问题了,我们是使用1方法还是2方法,有什么区别?

 

3.<>和IS NOT NULL的区别

 

现在我们先将B字段更改为允许为空属性,向里面制造一个为NULL的数据

MySQL处理空列 mysql空值的作用_MySQL处理空列_05

现在我们有个需求,需要搜索出字段B不为空的情况

有两种写法:

1.     SELECT * FROM test1 WHERE B <> ' '

结果为:

MySQL处理空列 mysql空值的作用_mysql_06

 

2.     SELECT * FROM test1 WHERE B IS NOT NULL

结果为:

MySQL处理空列 mysql空值的作用_null和空值区别_07

 

从上面可以看出,在写sql语句时,使用<>不等于符号将null值和空值全部都给过滤了

因此,如果只是需要查询出B字段为空情况,就使用第二种写法进行查询.第一种写法会将空值也给过滤掉

当然了,如果在业务中,应该取决于业务情况来选择需要用什么种方法进行查询

 

小结:<>查询会过滤掉null值和空值,IS NOT NULL不会过滤掉空值


 

4. IS NULL 和 IS NOT NULL概念

查看文档:

https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html

得出的结论:

1.在mysql中0或者NULL意味着假,其他任何都意味着真.boolean默认缺省值为1.

2.我们可以通过直观查看0和空值的意义

mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
|         0 |             1 |          0 |              1 |
+-----------+---------------+------------+----------------+

 

如有不对的地方,还需各位积极指正,谢谢!