[TOC] #### 1. 问题描述 --- 很多刚学 MySQL 的同学,第一次看到 `NULL`,都会下意识把它理解成 “空” 当需要查询某个字段为 NULL 的数据时,可能就会写出这样的 SQL: ```sql SELECT * FROM users WHERE phone = NULL; ``` 结果一执行,发现查不出数据 明明表里有些用户的手机号就是空的(NULL),为什么查不到 ? 问题就出在这里:`NULL` 不是一个普通的值 它表示的是:未知、不存在、没有填写,所以在 MySQL 里,`NULL` 不能直接用 `=` 来判断 #### 2. NULL 等于 NULL 吗 --- 先看一个例子: ```sql SELECT NULL = NULL; ``` 很多人第一反应是:既然左边是 NULL,右边也是 NULL,那结果应该是 true 吧 ? 但实际结果不是 true,而是: ```plaintext NULL ``` 也就是说,MySQL 不会认为它们相等 为什么 ? 因为 `NULL` 表示未知,一个未知的值,和另一个未知的值,能确定它们相等吗 ?当然不能。 举个生活中的例子: 有两个人都没有填写手机号,第一个人的手机号未知,第二个人的手机号也未知。 你能说他们手机号一样吗 ?不能。 因为它们可能一样,也可能不一样,只是现在都不知道而已。 这就是 NULL 的核心逻辑。 #### 3. 正确判断 NULL 的方式 --- 如果想查询手机号为空的用户,不能这样写: ```sql SELECT * FROM users WHERE phone = NULL; ``` 而应该写: ```sql SELECT * FROM users WHERE phone IS NULL; ``` 如果想查询手机号不为空的用户,就写: ```sql SELECT * FROM users WHERE phone IS NOT NULL; ``` 记住这两个写法就够了: ```plaintext IS NULL IS NOT NULL ``` 只要判断字段是不是空,就不要用 `=`,也不要用 `!=` #### 4. NULL 和 空字符串 --- 还有一个容易混淆的地方: ```plaintext NULL ``` 和 ```plaintext '' ``` NULL 和空字符串不是一回事 NULL 表示没有值,空字符串表示有值,只是这个值是空的字符串 比如用户没有填写昵称,可能是 `NULL`,但用户填写了一个空内容,可能就是 `''` 它们在数据库里不是同一个东西,所以这两条 SQL 查出来的结果也不一样 ```sql SELECT * FROM users WHERE nickname IS NULL; SELECT * FROM users WHERE nickname = ''; ``` 第一条查的是没有值,第二条查的是空字符串 #### 5. 实际开发中要注意什么 --- 在真实项目里,NULL 用不好,很容易带来一些小坑 + 查询条件写错,导致数据查不出来 + 统计数量时,某些字段是 NULL,结果和你想的不一样 + 后端判断时,没有区分 NULL 和空字符串,最后前端展示也乱了 所以我个人建议:如果一个字段允许为空,就要提前想清楚 “这个字段为空,到底代表什么” + 是用户没填 + 是系统还没生成 + 还是这个字段本来就不需要 不要随手让所有字段都可以为 NULL,字段设计越随意,后面代码判断就越麻烦 #### 6. 本文小结 --- NULL 到底等不等于 NULL ? 答案是:不等于 更准确地说,MySQL 里不能用 `=` 判断 NULL,因为 NULL 表示未知,不是一个普通的值 判断是否为空,要用: ```plaintext IS NULL ``` 判断是否不为空,要用: ```plaintext IS NOT NULL ``` 再记住一点:`NULL` 和空字符串 `''` 也不是一回事 这个知识点不难,但很多 SQL 问题,都是从这里开始踩坑的