MySQL IS NULL 和 IS NOT NULL 示例

⚡ 智能摘要

MySQL IS NULL 和 IS NOT NULL 是比较关键字,用于测试列中是否存在缺失值。NULL 表示数据不存在,其行为与零或空字符串不同,需要使用专用运算符才能进行可靠的筛选。

  • 🧩 核心定义: NULL 是表示数据不存在的占位符。它不是一种数据类型,也不是数字零。
  • 算术行为: 任何涉及 NULL 的算术表达式都会返回 NULL,因此 69 + NULL 的计算结果为 NULL 而不是 69。
  • 📊 总体影响: COUNT(column) 和其他聚合函数会跳过 NULL 行,而 COUNT(*) 仍然会计算表中的每一行。
  • 🚫 NOT NULL 约束: 将列声明为 NOT NULL 会拒绝任何省略值的插入操作,从而保护标识符等必填字段。
  • 🔍 正确过滤: 只有 IS NULL 和 IS NOT NULL 是可靠的测试,因为相等运算符永远不会匹配 NULL 值。
  • 三值逻辑: 与 NULL 进行比较返回 UNKNOWN,因此 SELECT NULL = NULL 会产生 NULL 而不是 TRUE。

MySQL IS NULL 和 IS NOT NULL

在 SQL 中,NULL 既是一个值,也是一个关键字。我们先来看一下 NULL 值。

MySQL 为空 & 不为空

NULL 是什么? MySQL?

简单来说, NULL 是一个占位符,表示数据不存在。在对表执行插入操作时,有时会遇到某些字段值不可用的情况。

为了满足真正的关系数据库管理系统的要求, MySQL 使用 NULL 作为尚未提交值的占位符。下面的屏幕截图显示了 NULL 值在数据库表中的显示方式。

Null 作为值

请注意,空单元格标记为 NULL,而不是空白文本或零。在继续之前,先了解一下 NULL 的一些基本概念。

  • NULL 不是数据类型 – 这意味着它不被识别为“int”、“date”或任何其他定义的数据类型。
  • 算术运算 涉及 时刻 返回 NULL例如,69 + NULL = NULL。
  • 桥梁 聚合函数 忽略包含 NULL 值的行唯一的例外是 COUNT(*),它会统计每一行,无论其中是否包含 NULL 值。

聚合函数如何处理 NULL 值

这条规则会改变报表查询返回的结果,让我们来验证一下。首先,我们来看 members 表的当前内容。

SELECT * FROM `members`;

执行上述脚本将得到以下结果。

membership_ number full_ names gender date_of_ birth physical_ address postal_ address contact_ number email
1 Janet Jones Female 21-07-1980 First Street Plot No 4 Private Bag 0759 253 542 janetjones@yagoo.cm
2 Janet Smith Jones Female 23-06-1980 Melrose 123 NULL NULL jj@fstreet.com
3 Robert Phil Male 12-07-1989 3rd Street 34 NULL 12345rm@tstreet.com
4 Gloria Williams Female 14-02-1984 2nd Street 23 NULL NULL NULL
5 Leonard Hofstadter MaleNULL Woodcrest NULL 845738767 NULL
6 Sheldon Cooper Male NULL Woodcrest NULL 976736763 NULL
7 Rajesh Koothrappali Male NULL Woodcrest NULL 938867763 NULL
8 Leslie Winkle Male 14-02-1984 Woodcrest NULL 987636553 NULL
9 Howard Wolowitz Male 24-08-1981 SouthPark P.O. Box 4563 987786553 lwolowitz[at]email.me

高亮显示的“联系电话”列共有九行,但其中两行是空值。让我们统计一下所有更新过联系电话的成员。

SELECT COUNT(contact_number) FROM `members`;

执行上述查询将得到以下结果。

COUNT(contact_number)
7

注意: 答案是 7 而不是 9,因为两个 NULL 值没有被包含在内。对同一张表运行 COUNT(*) 函数会返回 9,因为 COUNT(*) 函数统计的是行数而不是值数。

NOT NULL 值

更稳妥的做法是完全阻止 NULL 值进入必填列。这正是 NOT NULL 约束的作用。

什么是“非” Opera托尔?

NOT 逻辑运算符用于测试布尔条件,如果条件为假,则返回 true;如果条件为真,则返回 false。

Condition 不是 Opera结果

为什么要使用 NOT NULL?

有时我们需要对查询结果集进行计算并返回结果值。对包含 NULL 值的列执行任何算术运算都会返回 NULL 结果。为了避免这种情况,我们可以使用 NOT NULL 子句来限制要进行运算的数据范围。

创建包含 NOT NULL 列的表

假设我们要创建一个表,其中某些字段在插入新行时必须始终具有值。我们可以在创建表时对特定字段使用 NOT NULL 子句。

以下示例创建了一个包含员工数据的新表。必须始终提供员工编号。

CREATE TABLE `employees`(
  employee_number int NOT NULL,
  full_names varchar(255) ,
  gender varchar(6)
);

现在让我们尝试插入一条新记录,而不指定员工编号,看看会发生什么。

INSERT INTO `employees` (full_names,gender) VALUES ('Steve Jobs', 'Male');

在以下位置执行上述脚本 MySQL 工作台 因为缺少必填列,所以出现以下错误。

NOT NULL 值

IS NULL 和 IS NOT NULL 关键字

该约束会阻止新增 NULL 值。要处理已存在的 NULL 值,请使用关键字 NULL。语法如下。

column_name IS NULL
column_name IS NOT NULL

点击这里

  • “一片空白” 是执行布尔比较的关键字。如果提供的值为 NULL,则返回 true;如果提供的值不为 NULL,则返回 false。
  • “不为空” 是执行相反比较的关键字。如果提供的值不为 NULL,则返回 true;如果提供的值为 NULL,则返回 false。

让我们来看一个使用 IS NOT NULL 关键字来删除列中包含 NULL 值的所有行的实际示例。

继续使用上面的成员表,假设我们需要获取联系电话不为空的成员的详细信息。我们可以执行如下查询。

SELECT * FROM `members` WHERE contact_number IS NOT NULL;

执行上述查询仅返回包含联系电话的七条记录,这与上一节中的 COUNT 结果相符。

现在假设我们想要获取相反的结果:缺少联系电话的成员记录。我们可以使用以下查询。

SELECT * FROM `members` WHERE contact_number IS NULL;

执行上述查询,得到联系电话为 NULL 的两条成员记录。

membership_ number full_names gender date_of_birth physical_address postal_address contact_ number email
2 Janet Smith Jones Female 23-06-1980 Melrose 123 NULL NULL jj@fstreet.com
4 Gloria Williams Female 14-02-1984 2nd Street 23 NULL NULL NULL

警告: 即使存在 NULL 值,诸如 WHERE contact_number = NULL 之类的条件也会返回空结果集。相等运算符永远无法匹配 NULL,因此 IS NULL 是唯一正确的测试条件。

使用三值逻辑比较 NULL 值

三值逻辑 对包含 NULL 值的条件执行布尔运算可能会返回 “未知”、“真”或“假”.

使用“IS NULL”关键字 进行比较运算时 涉及 NULL 回报 true or false使用其他比较运算符返回 “未知”(NULL)下表对每个表达式进行了并排比较。

口语 成果
选择 5 = 5; 1 TRUE
选择 NULL = NULL; 未知
选择 5 > 5; 0 FALSE
选择 NULL > NULL; 未知
SELECT 5 IS NULL; 0 FALSE
SELECT NULL IS NULL; 1 TRUE

将数字 5 与自身进行比较,然后对 NULL 重复此操作。

SELECT 5 =5;
SELECT NULL = NULL;
5 =5 NULL = NULL
1 NULL

第一个结果是 1(真)。第二个结果是 NULL,因为 MySQL 不能断言一个未知值等于另一个未知值。现在对相同的值使用 IS NULL 关键字。

SELECT 5 IS NULL;
SELECT NULL IS NULL;
5 IS NULL NULL IS NULL
0 1

这次的答案是明确的:0(假)和 1(真)。只有 IS NULL 和 IS NOT NULL 关键字在涉及 NULL 值时才会返回明确的答案。

常见问题

零是数字,空字符串是文本,因此两者都符合相等性测试。NULL 表示根本没有提供任何值,所以它只响应 IS NULL 和 IS NOT NULL 语句。

IFNULL(column, 'N/A') 当列为 NULL 时返回替代值。COALESCE(a, b, c) 返回第一个非 NULL 的参数。这两个函数在内部都很有用。 MySQL 功能 和报告。

序号 MySQL 由于标识行的键不能缺失,因此会自动对每个主键列应用​​ NOT NULL 规则。唯一索引则不同,它允许存在多个 NULL 值。

通常是的。例如,某些工具中的人工智能助手。 MySQL 工作台 将“没有电话号码的成员”改为 WHERE 列 IS NULL 子句。 Rev请查看过滤器,因为与 NULL 进行相等性测试不会默默返回任何内容。

是的,通常会。人工智能审查工具会标记诸如 = NULL 比较之类的错误。 选择 它会计算包含 NULL 值的列的平均值,以及不包含 NULL 值的列表的平均值。最终判断权在于了解数据的人。

总结一下这篇文章: