之前面试的时候面试官问在数据库中,两个null是相等的吗?当时天真的我回答应该是吧,其实null是一个空值,如果非要必要比较的话,两个null比较应该还是null。在 MySQL 中,NULL 表示不知道的数据。
字段尽可能用NOT NULL,而不是NULL,除非特殊情况。
上图是《高性能 MySQL》4.1节中对于null值的描述,由此看来,把null改为not null对于提升索引的性能并没有什么显著的提升。避免使用null值的目的,是为了代码的可读性和可维护性。也为了避免下文出现的一些稀奇古怪的问题。
如下建两个表t1,t2,其中一个表的name字段允许为空,另一个表的name字段不允许为空,分别为name字段建立索引,SQL语句如下。
#### 1、NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回非空行的结果集 1、NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回非空行的结果集
比如上例中的 t2,我执行如下 SQL 语句。
SELECT * from t2 where name != ‘张三‘
预期返回id为1的行,结果啥都没有。
再举个例子
select * from t2 where name not in (select name from t2 where id!=1)
同样也是返回空结果集。
####2、使用 concat 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL
比如下面的SQL语句。
SELECT CONCAT("1",NULL);
#### 3、当用count函数进行统计时,NULL 列不会计入统计
####4、NULL 列需要更多的存储空间,一般需要一个额外的字节作为判断是否为 NULL 的标志位。
原文:https://www.cnblogs.com/sherlockwhite/p/why_not_null.html