PET表用于记录你的宠物信息。如果你想记录关于他们的其他信息,比如他们生活中的事件,比如访问兽医或者怀胎出生时,你可能就需要另一张表了。这张表应该是什么样子?它需要包含以下信息:

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

    • 日期以便您知道事件何时发生。

    • 用于描述事件的字段。

    • 事件类型字段,如果您希望能够对事件进行分类。


    鉴于以上考虑,event表的创建语句应该如下:

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

    与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 "D:/java/opensource/mysql/event.txt"
        -> into table event LINES TERMINATED BY '\r\n';
    Query OK, 10 rows affected (0.01 sec)
    Records: 10  Deleted: 0  Skipped: 0  Warnings: 0
    

    假设你想知道每只宠物拥有它的窝的年龄。我们之前看到如何计算两个日期的年龄。母亲的窝的日期记录在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来组合这些表。一如果两个表都符合子句中指定的条件,则内部连接允许两个表中的行出现在结果中。在这个例子中, 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 p2.sex = 'm';
    +--------+------+--------+------+---------+
    | name   | sex  | name   | sex  | species |
    +--------+------+--------+------+---------+
    | Fluffy | f    | Claws  | m    | cat     |
    | Buffy  | f    | Fang   | m    | dog     |
    | Buffy  | f    | Bowser | m    | dog     |
    +--------+------+--------+------+---------+