MySQL NULL的理解和应用

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

MySQL NULL值简介

在MySQL中,NULL值意味着未知值。 NULL值不是零或空字符''值。 NULL值不等于其自身值。 若是将NULL值与另外一个NULL值或任何其余值进行比较,则结果为NULL,由于每一个NULL值的值都是未知的。mysql

一般,使用NULL值来表示数据丢失,未知或不适用。 例如,当客户的电话号码可设置为NULL,而且能够稍后添加。sql

建立表时,能够经过使用NOT NULL约束来指定列是否接受NULL值。函数

例如,如下语句建立leads表:学习

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

所以,id是主键列,所以它不接受任何NULL值。code

customer_namesource列使用NOT NULL约束,所以,不能在这些列中插入NULL值。htm

emailphone列是能够接受NULL值的。 您能够在INSERT语句中使用NULL值来指定缺乏数据。例如,如下语句在leads表中插入一行。由于客户的电话号码丢失,所以这里使用了NULL值。排序

INSERT INTO leads(customer_name,source,email,phone)
VALUE('苏小鲁','Web Search','Xiaolu.su@studymysql.com',NULL);

因为电子邮件列(email)的默认值为NULL,所以能够在INSERT语句中省略电子邮件的值,以下所示:教程

INSERT INTO leads(customer_name,source,phone)
VALUES('王小丫','Cold Calling','13800138000'),
('王力宏','Web Search','13800138001');

接下来查询表中的数据,结果以下所示-索引

在UPDATE语句中使用MySQL SET NULL

要将列的值设置为NULL,请使用赋值运算符(=)。 例如,要将王小丫的电话更新为NULL,请使用如下UPDATE语句:

UPDATE leads 
SET 
    phone = NULL
WHERE
    id = 2;

MySQL ORDER BY NULL

若是使用ORDER BY子句以升序对结果集排序,MySQL认为NULL值低于其余值,所以,它首先显示NULL值。

如下语句按电话号码(phone)升序排列 leads 表中的数据。

SELECT 
    *
FROM
    leads
ORDER BY phone;

执行上面的查询语句后,结果以下所示 -

在使用ORDER BY DESC的状况下,NULL值出如今结果集的最后。 请参见如下示例:

SELECT 
    *
FROM
    leads
ORDER BY phone DESC;

执行上面的查询语句后,结果以下所示 -

要在查询中找出NULL值,请在WHERE子句中使用IS NULLIS NOT NULL运算符。

例如,要获取还没有提供电话号码的潜在客户信息,请使用IS NULL运算符,以下所示:

SELECT 
    *
FROM
    leads
WHERE
    phone IS NULL;

执行上面的查询语句后,结果以下所示 -

您可使用NOT NULL运算符获取有提供电子邮件地址的全部潜在客户信息。

SELECT 
    *
FROM
    leads
WHERE
    email IS NOT NULL;

执行上面的查询语句后,结果以下所示 -

即便NULL不等于NULL,可是在GROUP BY子句中的两个NULL值也是相等的。

SELECT 
    id, customer_name, email, phone
FROM
    leads
GROUP BY email;

执行上面的查询语句后,结果以下所示 -

查询只返回两行,由于电子邮件(email)列为NULL的行被分组为一行。

MySQL NULL和UNIQUE索引

在列上使用惟一约束或UNIQUE索引时,能够向该列插入多个NULL值。 这是彻底正常的,由于在这种状况下MySQL认为NULL值是不一样的。 让咱们经过在phone列上添加一个UNIQUE索引来验证这一点。

CREATE UNIQUE INDEX idx_phone ON leads(phone);

注意,若是使用BDB存储引擎,MySQL认为NULL值相等的,所以不能在具备惟一约束的列中插入多个NULL值。

MySQL NULL函数

MySQL提供了几个有用的函数来处理NULL值:ISNULLCOALESCENULLIFISNULL函数接受两个参数。 若是它不为NULLIFNULL函数返回第一个参数,不然返回第二个参数。

例如,如下语句显示电话号码,若是暂时不清楚则显示N/A,而不是NULL

SELECT 
    id, customer_name, IFNULL(phone, 'N/A') phone
FROM
    studymysql.leads;

执行上面的查询语句后,结果以下所示 -

COALESCE函数接受参数列表,并返回第一个非NULL参数。例如,您可使用COALESCE函数来根据信息的优先级按如下顺序显示潜在客户的联系信息:phone, email, 和 N/A。

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

执行上面的查询语句后,结果以下所示 -

NULLIF函数接受两个参数。 若是两个参数相等,则NULLIF函数返回NULL。 不然,它返回第一个参数。

当列中的值为NULL和空字符串时,NULLIF函数很是有用。 例如,错误地在leads表中插入如下行:

INSERT INTO leads(customer_name,source,email,phone)
VALUE('苏小撸','Web Search','xlu.su@studymysql.com','');

电话(phone)是空字符串,而不是NULL值。 若是您想获取潜在客户的联系信息,则最终获得一个空的电话,而不是电子邮件,如如下查询:

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

执行上面的查询语句后,结果以下所示 -

要解决这个问题,您可使用NULLIF函数将电话与空字符串进行比较,若是它们相等,则返回NULL,不然返回电话号码。

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

执行上面的查询语句后,结果以下所示 -

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

相关文章
相关标签/搜索