找设计师网站,网站建设市场报价,杭州手机网站建设公司 网络服务,做网站优化作为后台开发#xff0c;在日常工作中如果要接触Mysql数据库#xff0c;那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗#xff1f;学不动了#xff0c;也不想知道它们有什么区别。大兄弟#xff0c;不行啊#xff0c;要面试#xff01;前些天我的好…作为后台开发在日常工作中如果要接触Mysql数据库那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗学不动了也不想知道它们有什么区别。大兄弟不行啊要面试前些天我的好朋友小木去应聘工作他面试完回来和我聊天回味了一道他的面试题。面试官你有用过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_testCREATE TABLE tb_test ( one varchar(10) NOT NULL, two varchar(255) DEFAULT NULL) ENGINEInnoDB DEFAULT CHARSETutf8;插入进行验证-- 全部插入 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 nullmysql SELECT * FROM tb_test where one is NULL;Empty setmysql 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 setmysql SELECT * FROM tb_test where one ! ;-----------| one | two |-----------| 1 | NULL || 3 | 3 |-----------2 rows in setNULL值字段-- 使用 is null/is not nullmysql SELECT * FROM tb_test where two is not NULL;----------| one | two |----------| | 2 || 3 | 3 |----------2 rows in setmysql SELECT * FROM tb_test where two is NULL;-----------| one | two |-----------| 1 | NULL |-----------1 row in set-- 使用 、!mysql SELECT * FROM tb_test where two ;Empty setmysql 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 setmysql SELECT count(two) FROM tb_test;------------| count(two) |------------| 2 |------------1 row in setmysql 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 setmysql 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 表名; 查看这个表的所有索引信息。一个普通索引一个复合索引。复合索引遵守“最左前缀”原则即在查询条件中使用了复合索引的第一个字段索引才会被使用。因此在复合索引中索引列的顺序至关重要。可以看到创建了两个索引并且index_tow NULL 那一列是 YES。使用EXPLAIN 来进行演示说明EXPLAIN 的使用说明Mysql中explain用法和结果字段的含义介绍复合索引普通索引发现查询two字段 是可以正常使用索引的。我使用的MYSQL 5.7 ,InnoDB 引擎。也看了一些网上的资料MySQL中NULL对索引的影响 这个文章中用例子验证MySQL可以在含有null的列上使用索引。备注可能是其他条件下不行看网上资料说使用空间索引会失效具体我没有去验证空间索引没有用到过。查询官网create-index-spatial感兴趣的伙伴可以自行验证。这里我想到一点很多问题的答案都是在指定的条件和环境下才成立多质疑多验证。小总结 在有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值还是空值(’’)根据实际业务来进行区分。个人建议在实际开发中如果没有特殊的业务场景可以直接使用空值。以上就是我的对此问题的整理和思考。如果你对此话题有自己的思考和理解也欢迎留言一起探讨也欢迎私信我探讨交流哈还有免费的学习资料赠送