处理 NULL 值

NULL可能会令人惊讶,直到您习惯它。从概念上讲,NULL意味着“一个缺失的未知值”,它的处理方式与其他值有些不同。

要测试 NULL,请使用 IS NULL 和 IS NOT NULL 操作符,示例如下:

date mysql 置空 mysql空值处理_mysql查询空值和null

不能使用诸如 =、或 <> 之类的算术比较运算符来测试 NULL。请尝试以下查询:

date mysql 置空 mysql空值处理_mysql 多表联合查询_02

由于与NULL进行任何算术比较的结果也为NULL,因此无法从此类比较中获得任何有意义的结果。

在MySQL中,0或NULL表示false,其他任何值都表示true。布尔运算的默认真值为1。

这就是为什么在之前的介绍中,要用 death is NOT NULL而不是 death <> NULL来确定哪些动物已经死亡。

两个NULL值在GROUP BY中被视为相等。

在用 ORDER BY 排序时,如果使用 ORDER BY ... ASC,NULL值会排在最前面,如果使用 ORDER BY ... DESC 则 NULL 值排在最后。

在处理 NULL 时,一个常见的错误是认为不能将零或空字符串插入定义为 NOT NULL 的列中,但事实并非如此。0和空值('')是确实存在的值,而 NULL 意味着“没有值”。可以使用IS [NOT] NULL 进行测试,如下所示:

date mysql 置空 mysql空值处理_mysql查询空值和null_03

因此完全可以在非空列插入0或者空字符串('')。这些值都是非空值(NOT NULL)。

多表查询

pet表会记录你有哪些宠物。如果你想记录他们的其他信息,例如他们生活中的一些事情,比如看兽医或者生幼崽,这时需要另一张表。这张表应该是什么样子的?它需要包含以下信息:

● 宠物名字,这样你就知道每个事件都与哪种动物有关。

● 记录事件发生日期。

● 描述事件。

● 如果希望能够对事件进行分类,还需要事件类型字段。

考虑到这些因素,事件表的 CREATE TABLE 语句可能如下所示:

date mysql 置空 mysql空值处理_mysql查询空值和null_04

与pet表类似,向表加载初始记录的最简单方式就是,创建一个文本文件,加入以下信息,每个字段用制表符分隔。

name

date

type

remark

Fluffy

1995-05-15

litter

4 kittens, 3 female, 1 male

Buffy

1993-06-23

litter

5 puppies, 2 female, 3 male

Buffy

1994-06-19

litter

3 puppies, 3 female

Chirpy

1999-03-21

vet

needed beak straightened

Slim

1997-08-03

vet

broken rib

Bowser

1991-10-12

kennel

Fang

1991-10-12

kennel

Fang

1998-08-28

birthday

Gave him a new chew toy

Claws

1998-03-17

birthday

Gave him a new flea collar

Whistler

1998-12-09

birthday

First birthday

用如下方式加载数据:

mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;




根据在pet表上运行查询中学到的知识,您可以对event表中的记录执行检索,检索原则是相同的。但如果当event表不足以独立回答您提出的问题呢?

假设你想知道每只宠物的产仔年龄。我们早先看到了如何从两个日期计算年龄。母亲的产仔日期在event表中,但要计算她在该日期的年龄,需要知道她的出生日期,该日期存储在pet表中。这意味着查询需要两个表:

date mysql 置空 mysql空值处理_mysql多表联合查询_05

对于此查询,需要注意以下几点:

● FROM 子句连接两个表,因为查询需要从这两个表中提取信息。

● 联合多个表中的信息时,需要指定如何将一个表中的记录与另一个表中的记录匹配。这很容易,因为它们都有一个 name 列。查询使用 ON 子句根据 name 值匹配两个表中的记录。

查询使用 INNER JOIN 来联合表。当且仅当两个表都满足ON子句中指定的条件时,INNER JOIN 才允许两个表中的行出现在结果中。在本例中,ON 子句指定 pet 表中的 name 列必须与 event 表中的 name 列匹配。如果一个 name 出现在一个表中而没有在另一个表中,则该行将不会出现在结果中,因为 ON 子句中的条件匹配失败。

● 因为 name 列出现在两个表中,所以在引用列时必须具体说明所引用的表。这是通过在列名前加上表名来实现的。

执行联合不一定需要两个不同的表。有时,如果要将表中的记录与同一表中的其他记录进行比较,可以将表连接到自身。例如,要在您的宠物中查找繁殖配对,可以将pet表与自身连接起来,以生成同类物种的候选雄性和雌性配对:

date mysql 置空 mysql空值处理_date mysql 置空_06

在这个查询中,我们为表名指定别名来引用列,并保持每个列引用与相应表实例关联。