mysql中is null语句如何判断空值

来源:这里教程网 时间:2026-02-28 20:10:20 作者:

在MySQL里,判断空值,也就是

NULL
,我们必须使用
IS NULL
IS NOT NULL
语句。这是因为
NULL
代表的是一个未知或不确定的值,它不是一个具体的数值、字符串,也不是零或空字符串,所以不能用常规的等于(
=
)操作符来比较。

解决方案

要判断MySQL中的空值,最直接也是唯一正确的方法就是使用

IS NULL
。如果你想找出那些值不为空的记录,那就用
IS NOT NULL
。这听起来可能有点绕,但理解了
NULL
的“未知”本质,就很好接受了。

举个例子,假设你有一个表

users
,里面有个
email
字段,有些用户的邮箱可能没有填写,就是
NULL

要找出所有邮箱为空的用户:

SELECT * FROM users WHERE email IS NULL;

要找出所有邮箱不为空的用户:

SELECT * FROM users WHERE email IS NOT NULL;

你甚至可以在更新数据时利用它,比如把所有邮箱为空的用户的邮箱设置为一个默认值:

UPDATE users SET email = 'no_email_provided@example.com' WHERE email IS NULL;

在我看来,这种处理方式非常直观,一旦你习惯了,就会发现它比其他语言中对

NULL
的各种奇葩处理要清晰得多。

为什么不能用
=
来判断 MySQL 中的
NULL
值?

这其实是数据库领域一个挺基础,但又常常让人困惑的点。简单来说,

NULL
在SQL标准里,它代表的是“未知”或者“不存在”。当你在数据库里用
=
去比较任何东西和
NULL
的时候,包括
NULL = NULL
,结果都会是
UNKNOWN
(未知)。

我们平时写SQL的

WHERE
子句,它只接受
TRUE
的条件来返回结果。如果一个条件的结果是
UNKNOWN
,那么它就不会被视为
TRUE
,也就不会返回对应的行。

举个例子,如果你尝试这样做:

SELECT * FROM users WHERE email = NULL;

你会发现,这条语句几乎不会返回任何结果,即便你的

email
字段确实有很多
NULL
值。这是因为
email = NULL
这个表达式,对于每一行,它的结果都是
UNKNOWN
,而不是
TRUE

这和我们日常的数学逻辑有点不一样,但在数据库的世界里,

NULL
有它自己的一套规则,这套规则就是“三值逻辑”:
TRUE
FALSE
UNKNOWN
。理解了这一点,你就能避免很多关于
NULL
的查询错误。

MySQL 中
NULL
、空字符串和零有什么区别?

这个问题我被问过很多次,也看到不少新手在这里踩坑。虽然它们在某些语境下可能看起来“什么都没有”,但实际上,这三者在MySQL(乃至大部分关系型数据库)中有着本质的区别,理解它们对于数据存储和查询的准确性至关重要。

    NULL
    :

    含义:代表“未知”、“不适用”或“缺失”的值。它不是一个具体的值,而是一个值的状态。 存储:通常会占用一些存储空间(比如一个或几个字节来标记该列是否为
    NULL
    ),但具体取决于存储引擎和数据类型。
    行为不等于任何值,包括它自己(
    NULL = NULL
    UNKNOWN
    )。
    不参与聚合函数(如
    SUM()
    AVG()
    COUNT(column)
    ),除非你用
    COUNT(*)
    ORDER BY
    中,
    NULL
    通常会被排在最前面或最后面,这取决于具体的数据库配置和排序方式。

    空字符串 (

    ''
    ):

    含义:这是一个已知的、具体的字符串值,只是它的长度为零。 存储:占用存储空间,通常是一个字符的开销(比如VARCHAR类型会存储长度信息),或者在CHAR类型中填充空格。 行为是一个具体的值,可以被比较(
    '' = ''
    TRUE
    )。
    参与聚合函数(
    COUNT('')
    会计数)。
    LENGTH('')
    函数中,结果是
    0

    零 (

    0
    ):

    含义:这是一个已知的、具体的数值。 存储:占用存储空间,具体取决于数值类型(TINYINT, INT, BIGINT等)。 行为是一个具体的值,可以被比较(
    0 = 0
    TRUE
    )。
    参与所有数值运算和聚合函数。

来看一个直观的例子:

CREATE TABLE test_null_empty_zero (
    id INT PRIMARY KEY AUTO_INCREMENT,
    col_str VARCHAR(50),
    col_int INT
);
INSERT INTO test_null_empty_zero (col_str, col_int) VALUES
(NULL, NULL),
('', 0),
(' ', 10),
('hello', 20);
SELECT
    col_str,
    col_int,
    LENGTH(col_str) AS str_length,
    col_str IS NULL AS is_str_null,
    col_str = '' AS is_str_empty,
    col_int IS NULL AS is_int_null,
    col_int = 0 AS is_int_zero
FROM test_null_empty_zero;

运行这段代码,你会清楚地看到

NULL
''
0
LENGTH()
IS NULL
=
操作符下的不同表现。这三者虽然都可能表示“没有”或“不完整”,但在数据库层面,它们的语义和处理方式是截然不同的。

处理
NULL
值时,有哪些常见的陷阱和最佳实践?

处理

NULL
值,可以说是一个数据库开发者的基本功,但里面确实有不少容易掉进去的坑,同时也有一些行之有效的最佳实践。

常见陷阱:

    忘记
    IS NULL
    而使用
    = NULL
    : 这是最常见也最致命的错误。前面已经详细解释了,这会导致你的查询结果不正确,甚至根本没有结果。
    *`COUNT()
    vs
    COUNT(column_name)` 的区别**:
    COUNT(*)
    :会计算所有行的数量,包括那些包含
    NULL
    值的行。
    COUNT(column_name)
    :只会计算指定列中非
    NULL
    值的行数。 如果你想统计某个字段实际有多少条有效数据,却用了
    COUNT(*)
    ,那结果就错了。
    NULL
    ORDER BY
    中的行为不确定性
    : 不同的数据库系统,甚至同一系统在不同版本或配置下,
    NULL
    在排序时的位置可能不同。MySQL默认
    ASC
    NULL
    排在最前面,
    DESC
    时排在最后面。如果你不明确处理,可能会导致排序结果不符合预期。
    JOIN
    操作中
    NULL
    不匹配
    : 在
    JOIN
    条件中,如果参与
    JOIN
    的列包含
    NULL
    ,它们是不会匹配的,因为
    NULL = NULL
    UNKNOWN
    。例如,
    ON a.col = b.col
    ,如果
    a.col
    b.col
    都是
    NULL
    ,这条记录也不会被连接起来。
    聚合函数忽略
    NULL
    :
    SUM()
    ,
    AVG()
    ,
    MAX()
    ,
    MIN()
    等聚合函数在计算时会默认忽略
    NULL
    值。这通常是期望的行为,但如果你需要将
    NULL
    视为
    0
    或某个特定值参与计算,就需要显式处理。

最佳实践:

    始终使用
    IS NULL
    IS NOT NULL
    : 这是处理
    NULL
    值的黄金法则,没有例外。
    利用
    IFNULL()
    COALESCE()
    函数
    :
    IFNULL(expression, alternative_value)
    :如果
    expression
    NULL
    ,则返回
    alternative_value
    ,否则返回
    expression
    COALESCE(value1, value2, ..., valuen)
    :返回参数列表中第一个非
    NULL
    的值。 这两个函数在查询结果展示或参与计算时非常有用,可以将
    NULL
    值替换为更友好的显示或计算值,例如:
    SELECT name, IFNULL(email, '未提供邮箱') AS user_email FROM users;
    SELECT AVG(COALESCE(score, 0)) FROM exams; -- 将NULL分数视为0参与平均分计算
    合理使用
    NOT NULL
    约束
    : 在表设计阶段,对于那些业务上不允许为空的字段,务必加上
    NOT NULL
    约束。这能从源头上防止脏数据的产生,减少后期处理
    NULL
    值的复杂性。
    明确
    NULL
    的业务含义
    : 在设计数据库时,就应该明确哪些字段可以为
    NULL
    ,哪些不能。
    NULL
    是代表“未知”还是“不适用”?这有助于更好地理解数据,并编写出正确的查询逻辑。
    索引考虑
    NULL
    : MySQL的B-tree索引可以包含
    NULL
    值。如果你经常需要查询
    IS NULL
    IS NOT NULL
    的列,为这些列创建索引可能会提高查询性能。但要注意,某些数据库系统或索引类型对
    NULL
    值的处理可能有所不同。
    处理
    JOIN
    中的
    NULL
    : 如果你需要在
    JOIN
    条件中匹配
    NULL
    值,可能需要使用
    LEFT JOIN
    RIGHT JOIN
    结合
    IS NULL
    ,或者使用
    COALESCE()
    来预处理
    JOIN
    列。例如:
    SELECT a.*, b.*
    FROM table_a a
    LEFT JOIN table_b b ON COALESCE(a.col, -1) = COALESCE(b.col, -1); -- 假设-1是一个不可能出现的值

    这是一种处理

    NULL
    匹配的技巧,但要谨慎使用,确保替换值不会与实际数据冲突。

掌握这些,你在处理MySQL中的

NULL
值时,就能更加游刃有余,避免很多不必要的麻烦。

相关推荐

热文推荐