基本概念
在 MySQL 中,`NULL` 表示缺失或未知的值,它与空字符串 `''` 和数值 `0` 有本质区别。`IS NULL` 和 `IS NOT NULL` 是专门用于判断 `NULL` 值的关键字。
基本语法
查询字段为 NULL 的记录
SELECT 字段列表 FROM 表名 WHERE 字段名 IS NULL;
查询字段不为 NULL 的记录
SELECT 字段列表 FROM 表名 WHERE 字段名 IS NOT NULL;
重要特点
1. 特殊比较运算符:
必须使用 `IS NULL` 或 `IS NOT NULL` 来判断 NULL 值
使用 `=`、`!=` 或 `<>` 比较 NULL 值都会返回 NULL(不会报错但得不到预期结果)
2. 与空字符串的区别:
`NULL` 表示没有值
`''` 是长度为0的字符串
3. 与0的区别:
`NULL` 不是数值0
数值计算中 `NULL` 参与运算结果通常为 `NULL`
使用示例
1. 查询 NULL 值记录
查询没有登录日期的学生
SELECT name, login_date FROM students WHERE login_date IS NULL;
2. 查询非 NULL 值记录
查询已填写登录日期的学生
SELECT name, login_date FROM students WHERE login_date IS NOT NULL;
3. 与其他条件组合
查询没有登录日期且年龄大于20的学生
SELECT name, age, login_date FROM students WHERE login_date IS NULL AND age > 20;
查询有登录日期或是女生的学生
SELECT name, sex, login_date FROM students WHERE login_date IS NOT NULL OR sex = 'F';
常见误区
1. 错误使用等号判断NULL:
错误写法(不会返回结果)
SELECT name FROM students WHERE login_date = NULL;
正确写法
SELECT name FROM students WHERE login_date IS NULL;
2. 混淆NULL与空字符串:
查询空字符串(不是NULL)
SELECT name FROM students WHERE address = '';
查询NULL值
SELECT name FROM students WHERE address IS NULL;
3. 在聚合函数中的处理:
`COUNT(*)` 计算所有行数
`COUNT(字段)` 忽略NULL值
实际应用场景
1. 数据完整性检查:
检查必填字段是否有NULL值
SELECT COUNT(*) FROM customers WHERE phone IS NULL;
2. 数据清洗:
找出没有邮箱的用户以便补充数据
SELECT user_id, username FROM users WHERE email IS NULL;
3. 报表统计:
统计已完成订单和未完成订单(未完成订单的完成时间为NULL)
SELECT COUNT(*) AS total_orders, COUNT(completion_time) AS completed_orders, COUNT(*) - COUNT(completion_time) AS pending_orders FROM orders;
4. 性能优化建议
1. 索引使用:
对经常需要判断 `IS NULL` 的字段建立索引
注意:MySQL 中 `IS NULL` 条件可以使用索引
2. 默认值替代NULL:
考虑使用默认值(如空字符串或0)代替NULL
可以减少NULL判断,简化查询逻辑
3. 避免在WHERE中对字段使用函数:
不推荐(无法使用索引)
WHERE IFNULL(login_date, '2000-01-01') > '2020-01-01';
推荐
WHERE login_date IS NOT NULL AND login_date > '2020-01-01';
与COALESCE和IFNULL函数结合
使用COALESCE处理NULL值(返回第一个非NULL值)
SELECT name, COALESCE(login_date, '未登录') AS login_status FROM students;
使用IFNULL处理NULL值
SELECT name, IFNULL(login_date, 'N/A') AS login_date FROM students;
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程