mysql两个字段相减_MySQL 中NULL和空值的区别?

作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗?

04f24cc5cd3c25277af6fab60b36ef9d.png

学不动了,也不想知道它们有什么区别。大兄弟,不行啊,要面试!

前些天我的好朋友小木去应聘工作,他面试完回来和我聊天回味了一道他的面试题。

面试官:你有用过MySQL吗?

小木:有!

面试官:那你能大概说一下Mysql中 NULL值和空值的区别吗?

小木:(思考…)NULL和空值都用过,你要我说它两有啥区别,这个我还真没仔细想过,反正实际开发中会用!

听了小木的这个回答。

我说:你这样回答肯定是不妥的,这个问题你是必挂了。

小木说: NULL翻译过来不就是空吗?我是真的没有仔细想过,这个还是挺迷惑人的。

为了其他的伙伴在遇到这个问题的时候不要像我的好友小木一样在此处跌倒,错过心仪的公司,下面简单整理聊聊这两者的一些区别和使用。

02 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值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别。

2、插入/查询方式区别

创建一个表,tb_test

CREATE TABLE `tb_test` (

`one` varchar(10) NOT NULL,

`two` varchar(255) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入进行验证:

-- 全部插入 NULL,失败

mysql> INSERT tb_test VALUES (NULL,NULL);

1048 - Column 'one' cannot be null

-- 全部插入 空值,成功

mysql> INSERT tb_test VALUES ('','');

Query OK, 1 row affected

模拟数据:

INSERT tb_test VALUES (1,NULL);

INSERT tb_test VALUES ('',2);

INSERT tb_test VALUES (3,3);

空值字段:

-- 使用 is null/is not null

mysql> SELECT * FROM tb_test where one is NULL;

Empty set

mysql> SELECT * FROM tb_test where one is not NULL;

+-----+------+

| one | two |

+-----+------+

| 1 | NULL |

| | 2 |

| 3 | 3 |

+-----+------+

3 rows in set

-- 使用 = 、!=

mysql> SELECT * FROM tb_test where one = '';

+-----+-----+

| one | two |

+-----+-----+

| | 2 |

+-----+-----+

1 row in set

mysql> SELECT * FROM tb_test where one != '';

+-----+------+

| one | two |

+-----+------+

| 1 | NULL |

| 3 | 3 |

+-----+------+

2 rows in set

NULL值字段:

-- 使用 is null/is not null

mysql> SELECT * FROM tb_test where two is not NULL;

+-----+-----+

| one | two |

+-----+-----+

| | 2 |

| 3 | 3 |

+-----+-----+

2 rows in set

mysql> SELECT * FROM tb_test where two is NULL;

+-----+------+

| one | two |

+-----+------+

| 1 | NULL |

+-----+------+

1 row in set

-- 使用 = 、!=

mysql> SELECT * FROM tb_test where two = '';

Empty set

mysql> SELECT * FROM tb_test where two != '';

+-----+-----+

| one | two |

+-----+-----+

| | 2 |

| 3 | 3 |

+-----+-----+

2 rows in set

小总结:如果要单纯查NULL值列,则使用 is NULL去查,单纯去查空值(’’)列,则使用 =''。

建议查询方式:NULL值查询使用is null/is not null查询,而空值(’’)可以使用=或者!=、等算术运算符。

3、COUNT 和 IFNULL函数

使用COUNT函数:

mysql> SELECT count(one) FROM tb_test;

+------------+

| count(one) |

+------------+

| 3 |

+------------+

1 row in set

mysql> SELECT count(two) FROM tb_test;

+------------+

| count(two) |

+------------+

| 2 |

+------------+

1 row in set

mysql> SELECT count(*) FROM tb_test;

+----------+

| count(*) |

+----------+

| 3 |

+----------+

1 row in set

使用IFNULL函数:

mysql> SELECT IFNULL(one,111111111) from tb_test WHERE one = '';

+-----------------------+

| IFNULL(one,111111111) |

+-----------------------+

| |

+-----------------------+

1 row in set

mysql> SELECT IFNULL(two,11111111) from tb_test where two is NULL;

+----------------------+

| IFNULL(two,11111111) |

+----------------------+

| 11111111 |

+----------------------+

1 row in set

小总结:使用 COUNT(字段) 统计会过滤掉 NULL 值,但是不会过滤掉空值。

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

4、索引字段说明

看到网上有一些人说: MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。

给one 和two 字段分别加上普通索引。之前有写过,在复习添加索引:Mysql索引整理总结

-- ALTER TABLE table_name ADD INDEX index_name(col_name);

ALTER TABLE tb_test ADD INDEX index_oat (one, two);

ALTER TABLE tb_test add INDEX index_two(two);

使用 show keys from 表名;或show indexes from 表名; ,查看这个表的所有索引信息。

一个普通索引,一个复合索引。

复合索引遵守“最左前缀”原则即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。

d78322b3f7e0034c1283124ec0daafc5.png

可以看到,创建了两个索引,并且index_tow NULL 那一列是 YES。

使用EXPLAIN 来进行演示说明,EXPLAIN 的使用说明:Mysql中explain用法和结果字段的含义介绍

复合索引

6560eede157958f11829080d0c9dc2f2.png

普通索引

d4e7816bc45eff6fb15cc91b1db782c8.png

发现查询two字段 是可以正常使用索引的。我使用的MYSQL 5.7 ,InnoDB 引擎。也看了一些网上的资料,MySQL中NULL对索引的影响 这个文章中用例子验证,MySQL可以在含有null的列上使用索引。

备注:可能是其他条件下不行,看网上资料说使用空间索引会失效,具体我没有去验证,空间索引没有用到过。查询官网create-index-spatial,感兴趣的伙伴可以自行验证。

ee778a0e6ec10cf7abaa786637996f5a.png

这里我想到一点,很多问题的答案都是在指定的条件和环境下才成立,多质疑,多验证。

小总结 :在有NULL值得字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。在官网查看在空间索引的情况下,说明了 索引列必须为NOT NULL。

03 总结提升

如果你可以从上面的几个方面和面试官进行一个沟通,即使回答的不是那么的完美,但总比 “这两个都用过,具体有啥区别就不知道了” 这样的回答能好那么一点点。

1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。

2、当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为NULL的或者为 NULL 的,不能查出空值。

3、判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可以使用IFNULL()函数来进行处理,判断空字符用 =’‘或者<>’'来进行处理。

4、在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。

5、MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。这一句不是很准确。

6:实际到底是使用NULL值还是空值(’’),根据实际业务来进行区分。个人建议在实际开发中如果没有特殊的业务场景,可以直接使用空值。

以上就是我的对此问题的整理和思考。如果你对此话题有自己的思考和理解,也欢迎留言一起探讨!也欢迎私信我探讨交流哈,还有免费的学习资料赠送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做好计划事半功倍论文_Picocli 2.0:事半功倍

做好计划事半功倍论文介绍 Picocli是一个单文件命令行解析框架&#xff0c;它使您几乎不需要任何代码即可创建命令行应用程序。 使用Option或Parameters注释应用程序中的字段&#xff0c;picocli将分别使用命令行选项和位置参数填充这些字段。 例如&#xff1a; Command(name …

halcon python缺陷检测_Halcon学习笔记之缺陷检测(一)

*surface_scratch.hdev:extraction of surface scratches via local thresholding and morphological post-processing*dev_close_window()dev_update_window(‘off’)******step: acquire image //获取图片*****read_image(Image,’surface_scratch’) //读入图片名为’surfac…

Linux 脚本文件中开头的#!/bin/bash和#!/bin/sh是什么意思

解释 #!/bin/sh&#xff1a;表示此脚本使用 /bin/sh 来解释执行&#xff0c;#! 是特殊的表示符&#xff0c;其后面跟的是解释此脚本的 shell 的路径。 我们知道 shell 有很多种&#xff0c;例如&#xff0c;bash、csh、sh等&#xff0c;sh 是其中的一种&#xff0c;命令文件所…

srp unity_SRP是骗局

srp unity根据罗伯特马丁 &#xff08; Robert Martin&#xff09;的 《 清洁法 》&#xff08; Clean Code&#xff09; &#xff0c;“ 单一责任原则 ”意味着“一个阶级应该只有一个改变的理由”。 让我们尝试解密这个模糊的语句&#xff0c;看看它如何帮助我们设计更好的面…

html5app大赛,Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结

悦心,一款音乐播放器应用。由“女立方”团队开发。眼下。较为流行的音乐播放器有QQ音乐、网易云音乐、多米音乐等。“悦心”音乐播放器的主要功能&#xff0c;提供音乐数据库&#xff0c;点击列表播放音乐&#xff0c;还可对歌曲进行收藏。加入专属音乐心情功能。1.歌曲播放过程…

如何执行shell脚本文件

文章目录 一、使用 shell 命令解释器执行脚本二、使用命令 source 执行脚本文件三、使用路径方式执行脚本文件为什么不能在当前目录直接执行当前目录下的脚本文件呢?四、使用命令 exec 执行脚本文件五、它们有什么区别六、验证是否开启子进程(一)通过父 shell 中的变量是否正…

python 40位的数减个位数_Python——进制表示与转换

在前面两篇文章中介绍了基本的数据类型(Python——记录3——数据类型1&#xff0c;Python——记录4——数据类型2)&#xff0c;其中讲到浮点数的计算是通过转换成二进制进行的&#xff0c;那么到底什么是二进制&#xff0c;以及计算机到底包含了哪些进制呢&#xff1f;其实0和1…

javaee概览_Java 9概览

javaee概览对于许多Java 9来说&#xff0c;似乎是一个维护版本&#xff0c;它推动了不能在Java 8中实现的项目Jigsaw。但是&#xff0c;随着JDK中的新模块系统以及与之相关的许多内部更改&#xff0c;Java 9也带来了开发人员工具箱中一些很棒的新内容。 以下是重点内容&#xf…

Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令

文章目录一、命令介绍二、命令格式三、命令示例一、命令介绍 source 命令会在当前 Shell 环境中从指定文件读取和执行命令。source 命令通常用于重新执行刚修改的初始化文件&#xff0c;使之立即生效&#xff0c;而不必注销并重新登录。 source 命令&#xff08;从 C Shell 而…

opc调试软件_组态王和三菱OPC软件完美演绎天塔之光

许多朋友因为在学习组态王的过程中因为没有实物PLC而发愁&#xff0c;这里我通过天塔之光实例分享一个三菱OPC软件模拟实物PLC与组态王通信的方法。一、需要软件组态王软件三菱PLC编程软件GX Works2三菱OPC软件MX OPC Configurator二、控制要求主画面如上图所示的天塔灯光&…

jar混淆,防止反编译,Allatori工具混淆jar包

文章目录 Allatori工具简介下载解压配置config.xml注意事项 Allatori工具简介 官网地址&#xff1a;https://allatori.com/ Allatori不仅混淆了代码&#xff0c;还最大限度地减小了应用程序的大小&#xff0c;提高了速度&#xff0c;同时除了你和你的团队之外&#xff0c;任何人…

计算机基础知识学前自测,2011计算机二级C语言学前自测题:DOS的基本操作

DOS的基本操作1.DOS系统启动后&#xff0c;下列文件中常驻内存的是( )。A)DOS.COM B)COMMAND.COMC)DISKCOPY.COM D)SYS.COM2.若当前盘为C盘&#xff0c;在A盘目录\data中只有文本文件test.DAT&#xff0c;A 盘当前目录为根目录&#xff0c;则查看该文件的内容可使用的命令是( )…

string拆分为int_拆分为流

string拆分为int我正在为我工​​作的公司准备正则表达式教程更新。 原始教程创建于2012年&#xff0c;从那时起Java发生了一点变化。 有新的Java语言版本&#xff0c;尽管Java中的正则表达式处理仍不完善&#xff08;nb。它仍使用非确定性FSA&#xff09;&#xff0c;但仍有一…

Linux 命令之 type -- 显示指定命令的类型

文章目录一、命令介绍二、命令格式三、命令类型四、常用选项五、命令示例&#xff08;一&#xff09;查看命令的类型&#xff08;二&#xff09;显示外部命令的绝对路径一、命令介绍 type 命令用来显示指定命令的类型&#xff0c;判断给出的指令是内部指令还是外部指令。 二、…

python 查找算法_python快速查找算法应用实例

文实例讲述了Python快速查找算法的应用&#xff0c;分享给大家供大家参考。具体实现方法如下&#xff1a;import randomdef partition(list_object,start,end):random_choice start#random.choice(range(start,end1))#把这里的start改成random()效率会更高些x list_object[ra…

驾校约车html网站源码,html5首汽约车微信感恩活动页面模板

html5整屏滚动css3特效&#xff0c;各种c3特效&#xff0c;手机端支持各种分辨率&#xff0c;感恩活动微信页面模板下载。资源下载此资源下载价格为4D币&#xff0c;请先登录资源文件列表codedown123-0831-42/css/animate.min.css , 61353codedown123-0831-42/css/reset.css , …

java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...

java解析未知json使用Jackson API在Java中解析JSON时的常见问题之一是&#xff0c;当您的JSON包含未知属性&#xff08;即您的Java类没有对应于所有JSON属性的所有字段&#xff09;时&#xff0c;该操作将失败。 例如&#xff0c;如果您正在使用REST Web服务中的JSON&#xff0…

双非计算机考研推荐学校传菜电梯,22考研双非院校排名Top100,前3名竟然是这几所!...

原标题&#xff1a;22考研双非院校排名Top100&#xff0c;前3名竟然是这几所&#xff01;大家好&#xff01;这里考个研吧&#xff01;近年来&#xff0c;很多双非高校发展进步很快&#xff0c;实力超过很多末流211大学&#xff01;国家也实行了双一流、学科评估等&#xff0c;…

按压缩格式整理打包(解包)和压缩(解压)命令

文章目录一、zip 格式&#xff08;一&#xff09;使用命令 zip 压缩文件&#xff08;二&#xff09;使用命令 unzip 解压 zip 包二、tar 格式&#xff08;一&#xff09;打包文件&#xff08;二&#xff09;解包 tar 包三、tar.gz 格式方式一&#xff1a;利用已经打包好的tar文…

4线电子围栏安装示意图_知识积累|周界防护-脉冲电子围栏的安装

如今人们对于住宅需求早已今非昔比&#xff0c;不但需要足够大的空间&#xff0c;而且对于住宅所处位置是否交通便利&#xff0c;环境如何&#xff0c;光照情况都有要求&#xff0c;但是最关注的问题还是住宅的安全问题。如今的社会科技发达&#xff0c;不法分子的手段也层出不…