mysql no null_为什么建议MySQL列属性尽量用 NOT NULL?

之前面试的时候面试官问在数据库中,两个null是相等的吗?当时天真的我回答应该是吧,其实null是一个空值,如果非要必要比较的话,两个null比较应该还是null。在 MySQL 中,NULL 表示不知道的数据。

字段尽可能用NOT NULL,而不是NULL,除非特殊情况。

ee86853f22aaa599b299f883164b0a9d.png

上图是《高性能 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);

format,png

3、当用count函数进行统计时,NULL 列不会计入统计

format,png

4、NULL 列需要更多的存储空间,一般需要一个额外的字节作为判断是否为 NULL 的标志位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值