之前面试的时候面试官问在数据库中,两个null是相等的吗?当时天真的我回答应该是吧,其实null是一个空值,如果非要必要比较的话,两个null比较应该还是null。在 MySQL 中,NULL 表示不知道的数据。
字段尽可能用NOT NULL,而不是NULL,除非特殊情况。
上图是《高性能 MySQL》4.1节中对于null值的描述,由此看来,把null改为not null对于提升索引的性能并没有什么显著的提升。避免使用null值的目的,是为了代码的可读性和可维护性。也为了避免下文出现的一些稀奇古怪的问题。
如下建两个表t1,t2,其中一个表的name字段允许为空,另一个表的name字段不允许为空,分别为name字段建立索引,SQL语句如下。
![img1](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEsXe6mvOrSdEyMXjfHk5mibEOjrpenNWZ27uV5thib1QoPs2aSQpuXgZGg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![img2](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEspg9rp455ggXWQ99MHYo32d9HN7bZugf0iaQkzFgciamjsVkN3kibjf2Vw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![img3](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEsbM3PrFYtbn5YRkrt7rxBqAAmzIPlIlW94Jab73JgZ2dS4ISVjXB5OQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![img4](https://mmbiz.qpic.cn/mmbiz_png/R5ic1icyNBNd7IPeEicG7RuKOYdjpGSwHEsoV4NXEK8DcBXjxGHHwAamngU7mU3WnqC0bUwd10dyq1J1GM51PiaEww/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
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 的标志位。