一文带你探究MySQL中的NULL


Posted in MySQL onNovember 11, 2021

前言

不知道大家有没有遇到这样的问题,当我们在对MySQL数据库进行查询操作时,条件写的是status!=1,理论上会将所有不符合条件的查询出来,但奇怪的是结果为NULL的就查不出来,必须得拼接上条件or status IS NULL。本篇文章我们就一起探究一下MySQL中的NULL。

1 MySQL 中的NULL

对MySQL来说,NULL是一个特殊的值。

NULL表示不可知不确定,NULL不与任何值相等(包括其本身)

2 NULL占用的长度

NULL在数据库中占用的长度

mysql>  select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL         |          0 |           1 |
+--------------+------------+-------------+

NULL columns require additional space in the row to record whether their values are NULL.

可以看出空值''的长度是0,是不占用空间的;而的NULL长度是NULL,是需要占用额外空间的,所以在一些开发规范中,建议将数据库字段设置为Not NULL,并且设置默认值''或0。

3 对NULL值的比较

IS NULL 判断某个字符是否为空,并不代表空字符或者是0

SQL92标准中说道,!=NULL 条件判断永远返回false,聚合运算永远返回0

当然在数据库中可以使用SET ANSI_NULLS OFF关闭标准模式,但一般不建议这样去做

所以,要判断一个数是否等于NULL只能用 IS NULL 或者 IS NOT NULL 来判断

4 SQL对NULL值进行处理

MySQL中专门为我们提供了IFNULL(expr1,expr2)这个函数,让我们可以轻松的处理数据中的NULL

IFNULL有两个参数。 如果第一个参数字段不是NULL,则返回第一个字段的值。 否则,IFNULL函数返回第二个参数的值(默认值)。

select IFNULL(status,0) From t_user;

5 值为NULL 对查询条件的影响

  • 不能使用=,<,>这样的运算符,对NULL做算术运算的结果都是NULL(所以说当status为NULL时,status!=1不会统计到NULL)
  • 使用COUNT(expr) 统计时,也不会统计该字段为NULL的数据

6 值为NULL对索引的影响

首先需要注意的一点是,MySQL中某一列数据含有NULL,并不一定会造成索引失效。

MySQL可以在含有NULL的列上使用索引

在有NULL值得字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。但是在使用空间索引的情况下,该列就必须为 NOT NULL。

7 值为NULL对排序的影响

在ORDER BY排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的

如果我们需要在正序排序时,将NULL值放在后边,这里我们就需要巧借IS NULL

select * from t_user order by age is null, age; 
或者
select * from t_user order by isnull(name), age; 
# 等价于
select * from (select name, age, (age is null) as isnull from t_user) as foo order by isnull, age;

8 NULL和空值区别

NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符('')。

1、占用空间区别

mysql>  select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL         |          0 |           1 |
+--------------+------------+-------------+
1 row in set

小总结:从上面看出空值('')的长度是0,是不占用空间的;而的NULL长度是NULL,其实它是占用空间的,看下面说明。

NULL columns require additional space in the row to record whether their values are NULL.

NULL列需要行中的额外空间来记录它们的值是否为NULL。

通俗的讲:空值就像是一个真空转态杯子,什么都没有,而NULL值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别。

总结

到此这篇关于MySQL中NULL的文章就介绍到这了,更多相关MySQL中的NULL内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL kill不掉线程的原因
May 07 MySQL
详解mysql三值逻辑与NULL
May 19 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
SQL基础查询和LINQ集成化查询
Jan 18 MySQL
MySQL 开窗函数
Feb 15 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
数据设计之权限的实现
Aug 05 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 MySQL
mysql函数全面总结
Nov 11 #MySQL
MYSQL 运算符总结
Nov 11 #MySQL
MySQL 数据类型详情
Nov 11 #MySQL
MYSQL 表的全面总结
Nov 11 #MySQL
MySQL 服务和数据库管理
面试被问select......for update会锁表还是锁行
mysql的数据压缩性能对比详情
Nov 07 #MySQL
You might like
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
深入浅出php socket编程
2015/05/13 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
微信小程序实现侧边分类栏
2019/10/21 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
python中子类继承父类的__init__方法实例
2016/12/15 Python
Python切片索引用法示例
2018/05/15 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
python实现PCA降维的示例详解
2020/02/24 Python
Django URL参数Template反向解析
2020/11/24 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
美术专业个人自我评价
2014/01/18 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
SQL Server中使用表变量和临时表
2022/05/20 SQL Server