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的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;

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

要NULL在查询中测试 for ,请在子句中使用IS NULLorIS NOT NULL运算符WHERE。
例如,要获取尚未提供电话号码的潜在客户,请[IS NULL](https://www.mysqltutorial.org/mysql-is-null/)按如下方式使用运算符:
SELECT
*
FROM
leads
WHERE
phone IS NULL;

您可以使用IS NOT运算符获取提供电子邮件地址的所有潜在客户。
SELECT
*
FROM
leads
WHERE
email IS NOT NULL;

即使NULL不等于NULL,子句NULL中的两个值也相等GROUP BY。
SELECT
id, first_name, last_name, email, phone
FROM
leads
GROUP BY email;

该查询仅返回两行,因为电子邮件列所在的行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;

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

该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;

要解决此问题,您可以使用该NULLIF函数将电话与空字符串进行比较,如果相等,则返回NULL,否则返回电话号码。
SELECT
id,
first_name,
last_name,
COALESCE(NULLIF(phone, ''), email, 'N/A') contact
FROM
leads;

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