MySQL中空值和NULL的区别小结

 更新时间:2024年08月02日 11:41:21   作者:程序猿ZhangSir  
在 MySQL 中,NULL 值和空值是两个不同的概念,本文主要介绍了MySQL中空值和NULL的区别小结,具有一定的参考价值,感兴趣的可以了解一下

1. NULL和空值定义上的区别

在 MySQL 中,NULL 值和空值是两个不同的概念,空值就是我们常说的空字符串,用两个单引号 '' 代替即可;

NULL 值在MySQL中是占用空间的,而空值则是不占用长度空间的。

举个最简单的例子。

如果把数据比作水果,表中的每一个空位比作一个个箱子,水果要放进箱子里存储;

NULL就可以理解为空位上有一个箱子,但箱子是空的,没有存放任何水果;

空值就可以理解为空位上连箱子都没有,真空状态;

2. NULL和空值在表中显示的区别

如下SQL创建一张 user 用户表,

我将邮箱字段 email 和 性别字段 sex 默认值设计为空值,除了主键uid外其余字段默认值设计为NULL

CREATE TABLE `user` (
  `uid` int NOT NULL,
  `username` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
  `password` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT '',
  `sex` varchar(255) COLLATE utf8mb3_unicode_ci DEFAULT '',
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;

(特别注明:MySQL中创建表默认所有字段都是为NULL,上述建表SQL是我修改后展示给各位的,方便小伙伴复制使用,如果有小伙伴是自己直接创建的表,可以通过执行如下SQL修改字段默认值)

# 修改语法格式
ALTER TABLE 表名 
MODIFY 字段名 字段类型(要修改为的长度) DEFAULT '要修改为的默认值';
 
# 举例语句
# 将 user 表中 age字段长度改为 30,默认值改为kong '',如果只修改默认值,长度可以写原本的值
ALTER TABLE `user` MODIFY 
age VARCHAR(30) DEFAULT ''
...... 
如果要更新多个字段,按照字段名,字段类型(字段长度) DEFAULT 默认值的方式追加即可

然后我在表中添加几条数据,有些字段没有设置数据,SQL语句如下,想自己动手的小伙伴自行复制执行;

INSERT INTO `user` VALUES (1, '张三', '12345', 17, '12shfd', '男');
INSERT INTO `user` VALUES (2, '李四', NULL, 18, '', '男');
INSERT INTO `user` VALUES (3, 'NULL', NULL, NULL, '1763@qq', '女');
INSERT INTO `user` VALUES (4, '王五', NULL, NULL, '', '男');
INSERT INTO `user` VALUES (5, NULL, NULL, NULL, '', '');

执行完毕后,数据表如图,从这里我们就可以清晰地看出NULL值和空值的区别。

如果一个字段默认值为NULL我们没有填写数据,在表中就会显示NULL;

如果一个字段默认值为空值我们没有填写任何数据,在表中就是一片空白,不会显示NULL;

这里有一个误区,如果存储的数据中某条数据用户名为NULL,和在存储的过程中没有传入用户名数据库采用用户名默认值NULL不是相等的,这个应该很好理解。如下,id为3的那条数据,表示用户用户名就是NULL,;

3. NULL值和空值查询方式的区别

3.1 NULL 值的查询方式

查询一个字段的值是否为NULL,判断条件为 IS NULL(字段值为默认值NULL) 或 IS NOT NULL(字段值不为默认值NULL);

举例一:查询 user 用户表中字段 username 为 NULL 值的数据:

SELECT * FROM `user` WHERE `user`.username IS NULL

执行SQL,查到的只有id=5的这条数据,符合预期结果;

举例二:查询 user 用户表中字段 username 不为NULL值的数据;

SELECT * FROM `user` WHERE `user`.username IS NOT NULL

执行SQL,查到的是除了刚才id=5以外的四条数据,符合预期结果; 

3.2 空值的查询方式

空值的查询方式和普通字段查询一样,使用 "=" 或 "!=" 即可;

举例一:查询邮箱字段 email 为空值的数据

SELECT * FROM `user` WHERE `user`.email = '';

执行SQL,结果查询到id=2,4,5的三条数据,符合预期

 举例二:查询邮箱 email 和 性别 sex 都不为空值的数据

SELECT * FROM `user`
WHERE `user`.email != ''
AND `user`.sex != '';

执行SQL语句,查询到id=1,3的两条数据,符合预期 

3.3 查询NULL的方式可以查询空值

举例一:查询默认值为空值的字段 email 不为NULL的数据

SELECT * FROM `user` WHERE `user`.email IS NOT NULL;

执行SQL,查到了表中全部五条数据 

举例二:查询默认值为空值的字段email不为NULL值的数据

SELECT * FROM `user` WHERE `user`.email IS NULL;

执行SQL,没有数据,由此也可以说明 空值 != NULL  

 3.4 查询空值的方法不可以查询NULL值

 举例一:查询字段age默认值为NULL的为NULL的数据

SELECT * FROM `user` WHERE `user`.age = NULL;

执行SQL,没有查到任何数据,但也没有报错,

举例二:查询年龄字段age不为NULL的数据

SELECT * FROM `user` WHERE `user`.age != NULL;

执行SQL,结果仍然为空,可以看出,查询空值的办法并不适用于查询NULL值,查询NULL值只能使用IS NULL(为空),IS NOT NULL(不为空),否则会导致查询结果不准确

4.  聚合函数会计算空值但不计算NULL值

聚合函数 COUNT(),MIN(),SUM()等,他们在计算数据的时候会计算空值,却不会计算NULL值,这一点在COUNT() 计数函数中尤为明显;

SELECT COUNT(`user`.age) FROM `user`;

执行SQL,会发现结果是2,为什么呢?因为 user 表中id = 3,id=4,id=5这三条数据的age都是NULL,所以COUNT函数没有将它们计算在内,得出的结果就只有两条数据; 

 我们再来看空值的情况

SELECT COUNT(`user`.email) FROM `user`;

执行SQL,得出结果是5,和表中总记录数5一致,而我们在上面也看到了,表中id=2,id=4,id=5这三条数据的 email 都为空值,但是COUNT函数仍然将它们计算在内,这就是空值和NULL最大的区别

到此这篇关于MySQL中空值和NULL的区别实现的文章就介绍到这了,更多相关MySQL 空值和NULL区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL删除有外键约束的表数据方法介绍

    MySQL删除有外键约束的表数据方法介绍

    这篇文章主要介绍了MySQL删除有外键约束的表数据方法介绍,还是非常不错的,这里给大家分享下,需要的朋友可以参考。
    2017-10-10
  • 快速解决mysql57服务突然不见了的问题

    快速解决mysql57服务突然不见了的问题

    下面小编就为大家带来一篇快速解决mysql57服务突然不见了的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误的问题(最新推荐)

    解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误的问题(最新推荐)

    解决MySQL服务启动后停止没有报告任何错误的方法包括修改my.ini文件编码为ANSI、修正MySQL服务可执行文件的路径以及关闭系统管理中的MySQL80服务,本文介绍解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误,感兴趣的朋友一起看看吧
    2025-03-03
  • 修改MySQL数据库中表和表中字段的编码方式的方法

    修改MySQL数据库中表和表中字段的编码方式的方法

    这篇文章主要介绍了如何修改MySQL数据库中表和表中字段的编码方式,需要的朋友可以参考下
    2014-05-05
  • MySQL如何实现两张表取差集

    MySQL如何实现两张表取差集

    这篇文章主要介绍了MySQL如何实现两张表取差集问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • MySQL存储过程in、out和inout参数示例和总结

    MySQL存储过程in、out和inout参数示例和总结

    这篇文章主要给大家介绍了关于MySQL存储过程in、out和inout参数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • MYSQL数据插入之返回自增主键ID的方法详解

    MYSQL数据插入之返回自增主键ID的方法详解

    这篇文章主要介绍了MYSQL数据插入之返回自增主键ID的方法详解,mysql中的insert插入之后会有返回值,返回的是影响的行数,也就是说,成功插入一条数据之后返回的是1,失败则返回0,那么,很多时候我们都想要得到最后插入的id值,需要的朋友可以参考下
    2023-10-10
  • MySQL并发更新数据时的处理方法

    MySQL并发更新数据时的处理方法

    在后端开发中我们不可避免的会遇见MySQL数据并发更新的情况,作为一名后端研发,如何解决这类问题也是必须要知道的,同时这也是面试中经常考察的知识点。
    2019-05-05
  • MySQL随机查询记录的效率测试分析

    MySQL随机查询记录的效率测试分析

    以下的文章主要介绍的是MySQL使用rand 随机查询记录效率测试,我们大家一直都以为MySQL数据库随机查询的几条数据,就用以下的东东,其实其实际效率是十分低的
    2011-06-06
  • MySQL中外键的创建、约束以及删除

    MySQL中外键的创建、约束以及删除

    这篇文章主要给大家介绍了关于MySQL中外键的创建、约束以及删除的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论