Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

5.3.4.9 使用多个表

pet 表跟踪您拥有的宠物。如果您想记录他们的生活事件,例如兽医访问或新生幼崽,您需要另一个表。这个表应该是什么样的?它需要包含以下信息:

  • 宠物名称,以便您知道每个事件属于哪个动物。

  • 日期,以便您知道事件发生的时间。

  • 一个字段来描述事件。

  • 一个事件类型字段,如果您想对事件进行分类。

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

mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
       type VARCHAR(15), remark VARCHAR(255));

pet 表一样,最容易加载初始记录的方法是创建一个制表符分隔的文本文件,包含以下信息。

name date type remark
Fluffy 1995-05-15 新生幼崽 4 只幼崽,3 只雌性,1 只雄性
Buffy 1993-06-23 新生幼崽 5 只幼崽,2 只雌性,3 只雄性
Buffy 1994-06-19 新生幼崽 3 只幼崽,3 只雌性
Chirpy 1999-03-21 兽医 需要矫正喙
Slim 1997-08-03 兽医 肋骨骨折
Bowser 1991-10-12 狗舍
Fang 1991-10-12 狗舍
Fang 1998-08-28 生日 送了一只新的咀嚼玩具
Claws 1998-03-17 生日 送了一只新的跳蚤项链
Whistler 1998-12-09 生日 第一生日

加载记录如下:

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

基于您在 pet 表上运行的查询,您应该能够在 event 表记录上执行检索;原则相同。但是,当 event 表单独不足以回答您可能提出的问题时呢?

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

mysql> SELECT pet.name,
       TIMESTAMPDIFF(YEAR,birth,date) AS age,
       remark
       FROM pet INNER JOIN event
         ON pet.name = event.name
       WHERE event.type = 'litter';
+--------+------+-----------------------------+
| name   | age  | remark                      |
+--------+------+-----------------------------+
| Fluffy |    2 | 4 kittens, 3 female, 1 male |
| Buffy  |    4 | 5 puppies, 2 female, 3 male |
| Buffy  |    5 | 3 puppies, 3 female         |
+--------+------+-----------------------------+

有几点需要注意的:

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

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

    该查询使用 INNER JOIN 连接两个表。一个 INNER JOIN 允许从任一表中出现的行出现在结果中,只有当两个表都满足 ON 子句中的条件时。在这个示例中,ON 子句指定了 pet 表中的 name 列必须与 event 表中的 name 列匹配。如果一个名称出现在一个表中但不在另一个表中,该行不会出现在结果中,因为 ON 子句中的条件失败。

  • 因为 name 列出现在两个表中,您必须明确指定是哪个表的列。当引用列时,需要在列名前面加上表名。

您不需要两个不同的表来执行连接。有时,连接同一个表到自己本身也很有用,例如,如果您想比较同一个表中的记录。例如,要找到宠物的繁殖对,您可以将 pet 表连接到自己本身,以产生候选繁殖对:

mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
       FROM pet AS p1 INNER JOIN pet AS p2
         ON p1.species = p2.species
         AND p1.sex = 'f' AND p1.death IS NULL
         AND p2.sex = 'm' AND p2.death IS NULL;
+--------+------+-------+------+---------+
| name   | sex  | name  | sex  | species |
+--------+------+-------+------+---------+
| Fluffy | f    | Claws | m    | cat     |
| Buffy  | f    | Fang  | m    | dog     |
+--------+------+-------+------+---------+

在这个查询中,我们指定了表别名,以便引用列时可以明确指定是哪个表的列。