MySQL NULL:初学者指南

在本教程中,您将学习如何使用 MySQLNULL值。此外,您将学习一些有用的函数来NULL有效地处理这些值。

摘要:在本教程中,您将学习如何使用 MySQLNULL值。此外,您将学习一些有用的函数来NULL有效地处理这些值。

MySQLNULL值介绍

在 MySQL 中,NULL值意味着未知。甲NULL值是从零(不同0)或空字符串''。

一个NULL值不等于任何东西,甚至它本身。如果将一个NULL值与另一个NULL值或任何其他值进行比较,结果是NULL因为每个NULL值的值都是未知的。

通常,您使用该NULL值来指示数据缺失、未知或不适用。例如,潜在客户的电话号码可能是NULL并且可以稍后添加。

当你创建一个表,你可以指定一个列是否接受NULL使用值或没有[NOT NULL](../../database-and-table/not-null/index.md)约束。

例如,以下语句创建leads表:

DROP TABLE IF EXISTS leads;

CREATE TABLE leads (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    source VARCHAR(255) NOT NULL,
    email VARCHAR(100),
    phone VARCHAR(25)
);

在该leads表中,该列id是主键列,因此不接受任何NULL值。

的first_name,last_name和source列使用NOT NULL的限制,因此,你不能插入任何NULL值到这些列,而email与phone列接受NULL值。

您可以NULL在INSERT语句中使用一个值来指定数据丢失。例如,以下语句向leads表中插入一行。因为缺少电话号码,所以使用了一个NULL值。

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('John','Doe','Web Search','[email protected]',NULL);

因为 email 列的默认值是NULL,所以可以省略INSERT语句中的 email如下:

INSERT INTO leads(first_name,last_name,source,phone)
VALUES
    ('Lily','Bush','Cold Calling','(408)-555-1234'),
    ('David','William','Web Search','(408)-888-6789');

MySQL NULL 插入

MySQL的SET NULL在UPDATE声明

要将列的值设置为NULL,请使用赋值运算符 ( =)。例如,要更新的手机David William来NULL,可以使用下面的 UPDATE语句:

UPDATE leads 
SET 
    phone = NULL
WHERE
    id = 3;

MySQLORDER BY与NULL

如果使用该ORDER BY子句对结果集进行升序排序,MySQL 会认为NULL值低于其他值,因此会先呈现NULL值。

以下语句按电话号码升序对潜在客户进行排序。

SELECT 
    *
FROM
    leads
ORDER BY phone;

MySQL NULL ORDER BY

如果您使用ORDER BY DESC,则NULL值出现在结果集的最后。请参阅以下实例:

SELECT 
    *
FROM
    leads
ORDER BY phone DESC;

MySQL NULL ORDER BY DESC

要NULL在查询中测试 for ,请在子句中使用IS NULLorIS NOT NULL运算符WHERE。

例如,要获取尚未提供电话号码的潜在客户,请[IS NULL](https://www.mysqltutorial.org/mysql-is-null/)按如下方式使用运算符:

SELECT 
    *
FROM
    leads
WHERE
    phone IS NULL;

MySQL 为空

您可以使用IS NOT运算符获取提供电子邮件地址的所有潜在客户。

SELECT 
    *
FROM
    leads
WHERE
    email IS NOT NULL;

MySQL 不为空

即使NULL不等于NULL,子句NULL中的两个值也相等GROUP BY。

SELECT 
    id, first_name, last_name, email, phone
FROM
    leads
GROUP BY email;

MySQL NULL 与 GROUP BY

该查询仅返回两行,因为电子邮件列所在的行NULL被归为一列。

MySQLNULL和UNIQUE索引

在列上使用UNIQUE 约束或UNIQUE 索引时,可以向该列中插入多个NULL值。这完全没问题,因为在这种情况下,MySQL 认为NULL值是不同的。

让我们通过UNIQUE为phone列创建索引来验证这一点。

CREATE UNIQUE INDEX idx_phone ON leads(phone);

请注意,如果您使用 BDB存储引擎,MySQL 认为这些NULL值是相等的,因此您不能将多个NULL值插入具有唯一约束的列中。

MySQLNULL 函数

MySQL的那个把手NULL有效地提供了一些有用的功能:IFNULL,COALESCE,和NULLIF。

该IFNULL函数接受两个参数。该IFNULL如果不是函数返回的第一个参数NULL,否则返回第二个参数。

例如,以下语句返回电话号码,如果不是NULL,则返回N/A 而不是NULL。

SELECT 
    id, 
    first_name, 
    last_name, 
    IFNULL(phone, 'N/A') phone
FROM
    leads;

MySQL IFNULL 函数实例

该COALESCE函数接受参数列表并返回第一个非 NULL 参数。例如,您可以使用该COALESCE功能根据信息的优先级按以下顺序显示潜在客户的联系信息:电话、电子邮件和N/A。

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

MySQL COALESCE 函数实例

该NULLIF函数接受两个参数。如果两个参数相等,则NULLIF函数返回NULL。否则,它返回第一个参数。

NULLIF当您NULL在列中同时具有空字符串值时,该函数很有用。例如,您错误地在leads表中插入了以下行:

INSERT INTO leads(first_name,last_name,source,email,phone)
VALUE('Thierry','Henry','Web Search','[email protected]','');

电话是一个空字符串而不是NULL.

如果您想获取潜在客户的联系信息,您最终会得到一个空电话而不是电子邮件,如以下查询:

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(phone, email, 'N/A') contact
FROM
    leads;

MySQL NULL 和空字符串

要解决此问题,您可以使用该NULLIF函数将电话与空字符串进行比较,如果相等,则返回NULL,否则返回电话号码。

SELECT 
    id,
    first_name,
    last_name,
    COALESCE(NULLIF(phone, ''), email, 'N/A') contact
FROM
    leads;

MySQL NULLIF 函数实例

在本教程中,您学习了如何使用 MySQLNULL以及如何使用一些方便的函数来处理NULL查询。