1.3.4.9 多表查询

我们使用的表 pet 记录了您拥有多少只宠物,如果您想记录一些它们的生活事件,那么您需要新建一个数据表,这个数据表内容的包括:

  • 宠物的名字,让您知道事件是发生在哪个宠物身上的;
  • 事件发生的日期;
  • 事件的描述;
  • 事件的分类;

考虑到这些,我们使用 CREATE TABLE 创建新表 event

mysql> CREATE TABLE event (name VARCHAR(20), date DATE,
    -> type VARCHAR(15), remark VARCHAR(255));
Query OK, 0 rows affected (0.01 sec)

pet 表一样,我们使用 LOAD DATA LOCAL INFILE 导入数据到 envet 表;

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

创建 event.txt,并编辑如下的文本

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 '/data/www/mysql/event.txt' INTO table event;
Query OK, 10 rows affected (0.00 sec)
Records: 10  Deleted: 0  Skipped: 0  Warnings: 0

您可以运用之前章节中的知识,检查 event 表中的数据,以及练习一些查询操作;

假如您想知道宠物产仔的年龄情况,查询单个 event 无法满足您的需求,那么您需要用到如下的 2 个表联合查询:

mysql> SELECT pet.name, TIMESTAMPDIFF(YEAR, birth, date) as age, remark 
    -> FROM pet INNER JOIN event 
    -> ON pet.name = event.name
    -> WHERE 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         |
+--------+------+-----------------------------+
3 rows in set (0.00 sec)

从上面的语句中,我们可以得知:

  • FROM 的字句中联合了 两个表,因为我们需要从两个表中获取信息;
  • 当需要合并表时,两个表之间必需要有相匹配的内容,可以使用关键字 ON 来指定;
  • 如果合并的多个表中,出现相同的列名,比方我们的例子中 name ,此时需要列表所在的表,使用 table.column 来表示;

合并的两个表也可以是同一个表

比方说,您想要查询同一种类的宠物,可以进行交配的数据,那么,您可以执行下面的语句:

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     |
+--------+------+--------+------+---------+
3 rows in set (0.00 sec)

在后续的章节中,我们将会介绍 JOIN 的详细语法。

results matching ""

    No results matching ""