在MySQL数据库的实际使用中,我们经常会需要筛选出某个字段不为空的记录,这里的“不为空”通常包含两种不同的情况,一种是字段值不为NULL,另一种是字段值不为空字符串,两种场景的查询语法和适用场景有明显区别,需要分开处理。

一、查询字段值不为NULL的记录
MySQL中NULL表示字段没有值,是特殊的未知值,不能使用普通的比较运算符进行判断,必须使用IS_NOT_NULL关键字来筛选不为NULL的记录。
1. 基础语法
筛选指定表中某个字段不为NULL的所有记录,基础语法如下:
-- 查询user表中email字段不为NULL的所有记录 SELECT * FROM user WHERE email IS NOT NULL;
2. 多字段联合判断
如果需要同时判断多个字段都不为NULL,可以用AND连接多个判断条件:
-- 查询user表中email和phone字段都不为NULL的记录 SELECT * FROM user WHERE email IS NOT NULL AND phone IS NOT NULL;
二、查询字段值不为空字符串的记录
空字符串是长度为0的字符串,属于具体的值,不是NULL,因此不能用IS_NOT_NULL判断,需要用比较运算符进行判断。
1. 基础语法
筛选字段值不等于空字符串的记录,语法如下:
-- 查询user表中email字段不为空字符串的记录 SELECT * FROM user WHERE email != '';
2. 同时排除NULL和空字符串
实际开发中经常需要同时排除字段为NULL和空字符串的情况,这时候需要把两种判断条件组合起来:
-- 查询user表中email字段既不是NULL也不是空字符串的记录 SELECT * FROM user WHERE email IS NOT NULL AND email != '';
三、常见误区说明
- 不要使用
WHERE 字段名 != NULL来判断不为空,这种写法在MySQL中不会生效,结果永远为空,因为NULL和任何值比较都返回NULL,不会被判定为真。 - 如果字段是INT、DATE等非字符串类型,不需要判断空字符串,只需要判断
IS NOT NULL即可,因为这些类型不存在空字符串的存储情况。 - 如果字段设置了默认值'',插入数据时没有显式赋值就会存为空字符串,这时候需要明确是要排除NULL还是排除空字符串,避免漏筛数据。
四、实际场景示例
假设我们有如下user表结构:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT | 用户ID,主键 |
| username | VARCHAR(50) | 用户名 |
| VARCHAR(100) | 邮箱,允许为NULL |
现在需要查询所有已经填写了有效邮箱的用户,也就是email既不是NULL也不是空字符串,对应的查询语句如下:
SELECT id, username, email FROM user WHERE email IS NOT NULL AND email != '';
如果只需要查询邮箱不为NULL的用户,不管是不是空字符串,语句可以简化为:
SELECT id, username, email FROM user WHERE email IS NOT NULL;
MySQL查询不为空字段IS_NOT_NULL空值判断SQL查询修改时间:2026-07-03 21:57:28