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

在 SQL 中,NULL 既是一个值,也是一个关键字。我们先来看一下 NULL 值。
NULL 是什么? MySQL?
简单来说, NULL 是一个占位符,表示数据不存在。在对表执行插入操作时,有时会遇到某些字段值不可用的情况。
为了满足真正的关系数据库管理系统的要求, MySQL 使用 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 | |
|---|---|---|---|---|---|---|---|
| 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 | 12345 | rm@tstreet.com |
| 4 | Gloria Williams | Female | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Male | NULL | 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 工作台 因为缺少必填列,所以出现以下错误。
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 | |
|---|---|---|---|---|---|---|---|
| 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 值时才会返回明确的答案。


