MySQL 空值 (NULL) 查询
NULL 是 SQL 中的一个特殊标记,表示缺失或未知的数据。它不等于零(0)或空字符串('');它象征着没有任何值。因为 NULL 本身不是一个值,所以不能使用标准的比较运算符(如 =、< 或 >)来检查它的存在。相反,MySQL 提供了特定的运算符:IS NULL 和 IS NOT NULL。
1. 理解数据库中的 NULL
在数据库中,NULL 代表未知、不适用或故意留空的数据。它在维护数据完整性和准确反映信息状态方面发挥着至关重要的作用。
- 缺失的联系方式: 在客户表中,某个客户
email_address(电子邮件地址)列中的 NULL 值可能意味着该客户尚未提供电子邮件,或者单纯就是不知道。这绝不意味着他们的电子邮件字面上是一个空字符串或 '0'。 - 进行中的状态: 考虑一个存储员工信息的表。一个员工的
end_date(离职日期)如果他们目前仍在职,就可能是NULL。这个NULL清晰地指示了一个持续进行的状态,而不像一个具体的日期那样标记着终止。 - 未应用的折扣: 另一个例子是
orders(订单)表中的order_discount(订单折扣)列。如果一个订单没有获得折扣,order_discount中的值可能是NULL,表示没有应用任何折扣;而不是 0% 的折扣,因为 0% 意味着进行过计算并得出了零的结果。
2. 使用 IS NULL 检查 NULL 值
IS NULL 运算符在 WHERE 子句中使用,用于过滤特定列的值为 NULL 的行。此运算符明确检查数据的缺失。
为了说明这一点,让我们使用之前模块介绍的 world 数据库。我们将关注 city(城市)表,它包含全球城市的信息。这张表有一个名为 District(行政区)的列。对于某些城市,行政区信息可能是未知的或不适用的,从而导致 NULL 值。
-- 选择 District 为 NULL 的所有城市
SELECT
Name,
CountryCode,
District
FROM
city
WHERE
District IS NULL;在这个查询中:
SELECT Name,CountryCode,District指定要检索的列。FROM city指出我们正在查询city表。WHERE District IS NULL是过滤结果的条件,仅返回那些District列具有NULL值的行。
如果你正在分析城市并需要找出那些缺失行政区级别数据的城市(也许是为了数据录入或验证),这将特别有用。
2.1 IS NULL 的实际应用场景
想象一个 employees(员工)表,包含 employee_id、first_name、last_name、email 和 phone_number 等列。并非所有员工都提供了 phone_number(电话号码)。要查找未记录电话号码的员工:
-- 假设存在一个带有 'phone_number' 列的 'employees' 表
SELECT
employee_id,
first_name,
last_name,
email
FROM
employees
WHERE
phone_number IS NULL; -- 过滤没有记录电话号码的员工此查询将列出所有 phone_number 字段为空的员工,从而允许采取后续行动(如请求联系信息)。
3. 使用 IS NOT NULL 检查非 NULL 值
相反,IS NOT NULL 运算符用于检索列确实包含值(即它不是 NULL)的行。当你需要确保特定字段中存在数据时,这非常有用。
回到我们的 city 表示例:如果你想查看所有已记录 District 的城市,你将使用 IS NOT NULL。
-- 选择 District 不是 NULL 的所有城市
SELECT
Name,
CountryCode,
District
FROM
city
WHERE
District IS NOT NULL;在这个查询中:
WHERE District IS NOT NULL是过滤条件,仅返回District列具有任何非NULL值的行。这意味着它有一个明确的字符串或数字值,而不仅仅是一个空白。
这个查询有助于识别有完整行政区信息的城市,这对于需要精细数据的地理分析可能很有用。
3.1 IS NOT NULL 的实际应用场景
使用相同的 employees 表场景,如果你想找出所有确实拥有记录在案的电子邮件地址的员工(可能为了发送重要的公司公告),你将使用 IS NOT NULL。
-- 假设存在一个带有 'email' 列的 'employees' 表
SELECT
employee_id,
first_name,
last_name,
email
FROM
employees
WHERE
email IS NOT NULL; -- 过滤拥有已记录电子邮件地址的员工这个查询将高效地列出所有可以通过电子邮件联系的员工,确保公告传达给目标受众。
4. 将 IS NULL / IS NOT NULL 与其他条件组合
正如在之前的课程(结合使用 AND、OR、NOT)中所讲的,IS NULL 和 IS NOT NULL 可以使用逻辑运算符(如 AND、OR 和 NOT)与其他条件结合使用。这允许进行更复杂和精确的过滤。
4.1 示例:与 AND 组合
假设你想查找特定国家(例如,'USA')中缺失 District 信息的城市。
-- 选择位于 'USA' 且 District 为 NULL 的城市
SELECT
Name,
CountryCode,
District
FROM
city
WHERE
CountryCode = 'USA' AND District IS NULL;在这里,两个条件(CountryCode = 'USA' 和 District IS NULL)必须同时为真,该行才会被包含在结果集中。
4.2 示例:与 OR 组合
你可能需要查找要么没有行政区信息,要么属于特定国家的城市,以便进行即时的数据审查。
-- 选择 District 为 NULL 或者 CountryCode 为 'CHN'(中国)的城市
SELECT
Name,
CountryCode,
District
FROM
city
WHERE
District IS NULL OR CountryCode = 'CHN';这个查询将返回来自任何国家但缺失行政区数据的城市,以及来自中国的所有城市(无论其行政区数据状态如何)。