Mysql--关于NULL

公司DBA强制字段设置not null,不明觉厉,看了一下网上的文章,整理如下
创建表

CREATE TABLE `test02` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col1` varchar(255) NOT NULL,
  `col2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_col2` (`col2`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

col1不为null,col2默认为null,col2上定义了一个索引。
插入数据

insert into test02(col1,col2) values(“”,1)
insert into test02(col1,col2) values('2',null)

在这里插入图片描述
查询时直接用=判断

select * from test02 where col2=null

查询不出来col2为空的数据, n u l l 与 其 它 值 的 比 较 永 远 都 为 f a l s e 。 \color{#FF0000}{ null与其它值的比较永远都为false。} nullfalse

count为null的列

select count(col2) from test02

得到的行数也不包括col2为空的那一列。col2为null的那条记录不会查出来, 为 n u l l 的 那 一 列 不 会 参 与 c o u n t 行 数 计 算 \color{#FF0000}{为null的那一列不会参与count行数计算} nullcount

判断null列是否走索引

explain 
select * from test02 where col2 is null 

在这里插入图片描述
col2定义了索引,where中用is null判断的时候用到了。 为 n u l l 的 列 如 果 定 义 了 索 引 , 在 查 询 中 使 用 i s n u l l 判 断 也 会 用 到 索 引 \color{#FF0000}{ 为null的列如果定义了索引,在查询中使用is null判断也会用到索引} null使isnull

总结一下
定 义 为 n u l l 的 列 在 w h e r e 中 判 断 时 直 接 用 = 为 存 在 问 题 , n u l l 与 任 何 值 判 断 都 为 f a l s e , \color{#FF0000}{定义为null 的列在where中判断时直接用=为存在问题,null与任何值判断都为false,} nullwhere=nullfalse
并 且 c o u n t 为 n u l l 的 列 也 会 存 在 行 数 计 算 异 常 。 如 果 用 i s n u l l 判 断 是 不 会 有 问 题 的 , \color{#FF0000}{并且count为null的列也会存在行数计算异常。如果用is null判断是不会有问题的,} countnullisnull
如 果 定 义 了 索 引 , 也 会 用 到 索 引 的 \color{#FF0000}{如果定义了索引,也会用到索引的}

‘ ’ 和 n u l l 的 区 别 在 于 , ‘ ’ 不 会 占 用 空 间 , n u l l 会 占 用 空 间 , \color{#FF0000}{‘’和null的区别在于,‘’不会占用空间,null会占用空间,} nullnull
就 像 有 一 个 杯 子 , ‘ ’ 是 真 空 的 , n u l l 是 装 了 空 气 的 \color{#FF0000}{就像有一个杯子,‘’是真空的,null是装了空气的} null

可 为 n u l l 的 列 会 占 用 更 多 的 存 储 空 间 。 \color{#FF0000}{ 可为null的列会占用更多的存储空间。} null

参考
https://www.cnblogs.com/sherlockwhite/p/why_not_null.html
http://www.zzvips.com/article/920.html
https://www.runoob.com/mysql/mysql-null.html
https://www.jianshu.com/p/0c909bf62bcd

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值