MySQL 开发避坑:NULL 和空值不是一回事
目录一. NULL和空值定义上的区别二. NULL和空值在表中显示的区别三. NULL值和空值查询方式的区别3.1 NULL 值的查询方式3.2 空值的查询方式3.3 查询NULL的方式可以查询空值3.4 查询空值的方法不可以查询NULL值四. 聚合函数会计算空值但不计算NULL值一. NULL和空值定义上的区别在 MySQL 中NULL 值和空值是两个不同的概念空值就是我们常说的空字符串用两个单引号 代替即可NULL 值在MySQL中是占用空间的而空值则是不占用长度空间的。举个例子如果把数据比作水果表中的每行数据的每个字段空位比作一个个箱子水果要放进箱子里存储NULL就可以理解为空位上有一个箱子但箱子是空的没有存放任何水果空值就可以理解为空位上连箱子都没有真空状态二. NULL和空值在表中显示的区别如下SQL创建一张 user 用户表我将邮箱字段 email 和 性别字段 sex 默认值设计为空值除了主键uid外其余字段默认值设计为NULLCREATE 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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb3 COLLATEutf8mb3_unicode_ci;特别注明MySQL中创建表默认所有字段都是为NULL上述建表SQL是我修改后展示给各位的方便复制使用如果是自己直接创建的表可以通过执行如下SQL修改字段默认值# 修改语法格式 ALTER TABLE 表名 MODIFY 字段名 字段类型(要修改为的长度) DEFAULT 要修改为的默认值; # 举例语句 # 将 user 表中 age字段长度改为 30默认值改为空 ,如果只修改默认值长度可以写原本的值 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, 1763qq, 女); INSERT INTO user VALUES (4, 王五, NULL, NULL, , 男); INSERT INTO user VALUES (5, NULL, NULL, NULL, , );执行完毕后数据表如图从这里我们就可以清晰地看出NULL值和空值的区别。如果一个字段默认值为NULL我们没有填写数据在表中就会显示NULL如果一个字段默认值为空值我们没有填写任何数据在表中就是一片空白不会显示NULL这里有一个误区如果存储的数据中某条数据用户名为NULL和在存储的过程中没有传入用户名数据库采用用户名默认值NULL不是相等的这个应该很好理解。举例id 为3的那条数据表示用户名就是字符串 NULL三. NULL值和空值查询方式的区别3.1 NULL 值的查询方式查询一个字段的值是否为NULL判断条件为 IS NULL(字段值为默认值NULL) 或 IS NOT NULL(字段值不为默认值NULL)不能使用 ! 因为这两个判断符号是用来判断值的而 NULL 则代表当前字段没有实际值不能使用 ! 来进行判断。举例一查询 user 用户表中字段 username 为 NULL 值的数据SELECT * FROM user WHERE user.username IS NULL执行SQL查到的只有id5的这条数据符合预期结果举例二查询 user 用户表中字段 username 不为NULL值的数据SELECT * FROM user WHERE user.username IS NOT NULL执行SQL查到的是除了刚才id5以外的四条数据符合预期结果3.2 空值的查询方式空值的查询方式和普通字段查询一样使用 或 ! 即可举例一查询邮箱字段 email 为空值的数据SELECT * FROM user WHERE user.email ;执行SQL结果查询到id245的三条数据符合预期举例二查询邮箱 email 和 性别 sex 都不为空值的数据SELECT * FROM user WHERE user.email ! AND user.sex ! ;执行SQL语句查询到id13的两条数据符合预期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没有数据由此也可以说明 空值 ! NULL3.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(不为空)否则会导致查询结果不准确四. 聚合函数会计算空值但不计算NULL值聚合函数 COUNT()MIN()SUM()等他们在计算数据的时候会计算空值却不会计算NULL值这一点在COUNT() 计数函数中尤为明显SELECT COUNT(user.age) FROM user;执行SQL会发现结果是2为什么呢因为 user 表中id 3id4id5这三条数据的age都是NULL所以COUNT函数没有将它们计算在内得出的结果就只有两条数据我们再来看空值的情况SELECT COUNT(user.email) FROM user;执行SQL得出结果是5和表中总记录数5一致而我们在上面也看到了表中id2id4id5这三条数据的 email 都为空值但是COUNT函数仍然将它们计算在内这就是空值和NULL最大的区别