Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL null值坑

浅谈MySQL 中 null 值的那些坑

作者:Leaton Lee

本文解析MySQL中null值的定义与常见问题,如比较运算符失效、WHERE条件误用、IN子查询异常,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引言:null 值到底是什么?

在 MySQL 数据库中,null 是一个特殊的值,表示“未知”或“不存在”的含义。它不同于空字符串("")或零(0),而是明确表示该字段没有值。

然而,在实际开发中,很多人会遇到 null 值带来的“坑”。比如:

今天,我就结合自己的实战经验,详细讲解 null 值的常见问题及解决方法,帮助你避开这些“坑”!

第一部分:null 值的常见问题

问题 1:使用=和<>比较 null 的时候总是失败

很多人习惯用 = 或 <> 来判断字段是否为 null,但这是错误的!因为 null 是一个“未知值”,无法用普通的比较运算符进行判断。

示例场景:
假设有如下数据表:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    email VARCHAR(100)
);
 
INSERT INTO users VALUES 
(1, 'Alice', 25, 'alice@example.com'), 
(2, 'Bob', 30, NULL),
(3, 'Charlie', NULL, 'charlie@example.com'); 

执行以下查询:

SELECT * FROM users WHERE email = NULL; -- 查不到任何结果 
SELECT * FROM users WHERE email <> NULL; -- 同样查不到任何结果 

原因:
null 是一个不确定的值,无法用 = 或 <> 进行比较。任何与 null 的比较都会返回 false

问题 2:在WHERE子句中使用IS NULL和IS NOT NULL的时候忘记逻辑

有时候,开发者会忘记 IS NULL 和 IS NOT NULL 的正确用法,导致查询结果不符合预期。

示例场景:
继续使用上面的 users 表。

SELECT * FROM users WHERE email IS NULL; -- 正确的结果:Bob 的记录 
SELECT * FROM users WHERE age IS NOT NULL; -- 正确的结果:Alice 和 Charlie 的记录 

常见错误:

SELECT * FROM users WHERE email = NULL; -- 错误!返回空结果 

问题 3:在IN和NOT IN语句中使用 null 值

在 IN 和 NOT IN 语句中使用包含 null 的子查询时,可能会出现意想不到的结果。

示例场景:
假设有两张表:

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10, 2)
);
 
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);
 
INSERT INTO orders VALUES 
(1, 1, 100.00),
(2, 2, 200.00),
(3, 3, 300.00);
 
INSERT INTO users VALUES 
(1, 'Alice', 'alice@example.com'), 
(2, 'Bob', NULL),
(3, 'Charlie', 'charlie@example.com'); 

执行以下查询:

SELECT * FROM orders 
WHERE user_id IN (SELECT user_id FROM users WHERE email IS NULL); -- 正确的结果:Bob 的订单 

常见错误:

SELECT * FROM orders 
WHERE user_id IN (SELECT user_id FROM users WHERE email = NULL); -- 错误!返回空结果 

第二部分:解决 null 值问题的方法

方法 1:使用IS NULL和IS NOT NULL进行判断

这是处理 null 值的正确方式。

示例代码:

-- 查询 email 为 null 的用户 
SELECT * FROM users WHERE email IS NULL;
 
-- 查询 age 不为 null 的用户 
SELECT * FROM users WHERE age IS NOT NULL;

注意事项:

方法 2:在IN和NOT IN语句中正确处理 null 值

如果子查询中包含 null 值,可以使用 COALESCE 函数将其转换为其他值。

示例代码:

-- 正确的写法:使用 COALESCE 将 null 转换为一个不存在的值 
SELECT * FROM orders 
WHERE user_id IN (
    SELECT COALESCE(user_id, -1) FROM users WHERE email IS NULL 
);

解释:

方法 3:在插入和更新数据时明确处理 null 值

在插入或更新数据时,要确保字段允许存储 null 值。如果字段被定义为 NOT NULL,则必须提供非空值。

示例代码:

-- 插入 null 值 
INSERT INTO users (id, name, age, email) 
VALUES (4, 'David', NULL, 'david@example.com'); 
 
-- 更新 null 值 
UPDATE users SET email = NULL WHERE id = 4;

注意事项:

第三部分:注意事项

注意 1:不要混淆 null 和空字符串

示例场景:

-- 查询 email 为 null 的用户 
SELECT * FROM users WHERE email IS NULL;
 
-- 查询 email 为空字符串的用户 
SELECT * FROM users WHERE email = '';

注意 2:在排序时 null 的行为

在排序时,null 的行为可能与预期不同。默认情况下,null 会被视为最小值(在升序排列中排在最前面)。

示例代码:

-- 按 age 升序排列,null 排在最前面 
SELECT * FROM users ORDER BY age ASC;
 
-- 按 age 降序排列,null 排在最后面 
SELECT * FROM users ORDER BY age DESC;

注意 3:在聚合函数中处理 null 值

聚合函数(如 SUMAVGCOUNT)会忽略 null 值。

示例场景:

-- 计算所有用户的平均年龄(忽略 null 值)
SELECT AVG(age) FROM users;

总结:正确处理 null 值的三个关键点

  1. 使用 IS NULL 和 IS NOT NULL 进行判断
  2. 在子查询中使用 COALESCE 处理 null 值
  3. 在插入和更新时明确字段是否允许 null 值

通过以上方法,你可以轻松避开 null 值带来的“坑”,写出更健壮的 SQL 语句!

互动时间:你踩过哪些 null 值的坑?

到此这篇关于MySQL 中 null 值的那些坑,你踩过吗?的文章就介绍到这了,更多相关MySQL null值坑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文