对于这个问题,通常能听到的答案是 使用了 NULL 值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引.所以上述说法有漏洞.

   NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,Mysql会默认的为我们添加上NULL约束. 有些开发人员在创建数据表时,由于懒惰直接使用 Mysql 的默认推荐设置.(即允许字段使用NULL值).而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降.

NULL并不意味着什么都没有,我们要注意 NULL 跟 ''(空值)是两个完全不一样的值.MySQL 中可以操作NULL值操作符主要有三个.

  • IS NULL
  • IS NOT NULL
  • <=> 太空船操作符,这个操作符很像=,select NULL<=>NULL可以返回true,但是select NULL=NULL返回false.
  • IFNULL 一个函数.怎么使用自己查吧…反正我会了
  •  
  • mysql decimal 设置默认无效 mysql设置默认值为null_MySQL

  •  NULL 代表一个不确定的值,就算是两个 NULL,它俩也不一定相等.(像不像 C 中未初始化的局部变量)

mysql decimal 设置默认无效 mysql设置默认值为null_数据库_02

 任何有返回值的表达式中有NULL参与时,都会得到另外一个NULL值.

mysql decimal 设置默认无效 mysql设置默认值为null_数据库_03

 

使用count(*) 或者 count(null column)结果不同,count(null column)<=count(*).

mysql decimal 设置默认无效 mysql设置默认值为null_数据库_04

 虽然select NULL=NULL的结果为false,但是在我们使用distinct,group by,order by时,NULL又被认为是相同.

mysql decimal 设置默认无效 mysql设置默认值为null_MySQL_05

mysql decimal 设置默认无效 mysql设置默认值为null_字段_06

 

MySQL 中支持在含有NULL值的列上使用索引,但是Oracle不支持.这就是我们平时所说的如果列上含有NULL那么将会使索引失效.

严格来说,这句话对与 MySQL 来说是不准确的.

总结:

列中使用NULL值容易引发不受控制的事情发生,有时候还会严重托慢系统的性能. 对含有 NULL 值的列进行统计计算,eg. count(),max(),min(),结果并不符合我们的期望值.干扰排序,分组,去重结果.有的时候为了消除NULL带来的技术债务,我们需要在 SQL 中使用IFNULL()来确保结果可控,但是这使程序变得复杂.NULL值并是占用原有的字段空间存储,而是额外申请一个字节去标注,这个字段添加了NULL约束.(就像额外的标志位一样)根据以上缺点,我们并不推荐在列中设置 NULL 作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者''空字符串来代替NULL