SQL NULL:空值

1年前 (2024-04-28)
在 SQL 中,关键字 NULL 用来表示缺失的值,也即空值,或者没有值。NULL 值不等同于零值,也不等同于包含空格的字段,理解这一点非常重要。

表的字段默认允许存放 NULL 值,这意味着,您在插入记录或者更新记录时,可以不为该字段指定值,此时该字段将存储 NULL 值。

在查询结果中,空值将显示为空白或者 NULL,如下所示:

sir_name

name

marks

TYAGI

SEEMA

NULL

SINGH

RAMAN

5.5

SHARMA

AMAR

NULL

JAISWAL

VICKY

6.2


条和第三条记录的 MARKS 字段就出现了 NULL 值。

语法

在创建数据表时可以指定某个字段是否允许为 NULL,基本语法如下:

CREATE TABLE website (

id INT NOT NULL AUTO_INCREMENT,

name VARCHAR(20) NOT NULL,

url VARCHAR(30),

age TINYINT UNSIGNED NOT NULL,

alexa INT UNSIGNED NOT NULL,

uv FLOAT DEFAULT '0',

country CHAR(3) NOT NULL DEFAULT '',

PRIMARY KEY (`id`)

);

NOT NULL 关键字表示不允许该字段为空值,在插入或者更新记录时必须为该字段指定一个具体的值。url 和 uv 两个字段没有使用 NOT NULL 关键字,这意味着它们保持默认,也即允许为 NULL。注意,uv 字段指定了默认值 0,如果不为该字段提供值,它的值将是 0;url 字段没有指定默认值,如果不为该字段提供值,它的值将是 NULL。

示例

在选取数据时,NULL 值可能会导致一些问题,因为 NULL 值和其它任何值比较的结果都是未知的,所以包含 NULL 值的记录始终不能被筛选。

我们不能使用 =、<、> 等比较运算符来检测 NULL 值,而必须使用 IS NULL 或者 IS NOT NULL 关键字来检测 NULL 值。

现在有一个包含如下记录的 website 表:

+----+----------------+-------------------------+-----+-------+---------+---------+

| id | name | url | age | alexa | uv | country |

+----+----------------+-------------------------+-----+-------+---------+---------+

| 1 | 百度 | https://www.baidu.com/ | 20 | 4 | 5010.5 | CN |

| 2 | 淘宝 | NULL | 20 | 8 | 3996.75 | CN |

| 3 | C语言中文网 | http://c.biancheng网站站点" rel="nofollow" />

SELECT id, name, age, uv, country

FROM website

WHERE url IS NOT NULL;

执行结果:

+----+-------------+-----+--------+---------+

| id | name | age | uv | country |

+----+-------------+-----+--------+---------+

| 1 | 百度 | 20 | 5010.5 | CN |

| 3 | C语言中文网 | 12 | 11.62 | CN |

| 4 | Google | 23 | 36474 | US |

| 5 | GitHub | 15 | 216.3 | US |

| 7 | Yandex | 11 | 591.82 | RU |

| 8 | VK | 23 | 1206 | RU |

+----+-------------+-----+--------+---------+


再如,下面是 IS NULL 关键字的用法:

SELECT id, name, age, uv, country

FROM website

WHERE url IS NULL;

执行结果:

+----+----------------+-----+---------+---------+

| id | name | age | uv | country |

+----+----------------+-----+---------+---------+

| 2 | 淘宝 | 20 | 3996.75 | CN |

| 6 | Stack Overflow | 15 | 592.2 | US |

+----+----------------+-----+---------+---------+