使用1个以上的表

使用1个以上的表(http://blog.163.com/zswself@126/blog/static/22588036200712522214929/)
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

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表中。这说明查询需要两个表:
mysql> SELECT pet.name,
      -> (YEAR(date)-YEAR(birth)) - (RIGHT(date,5)
      -> remark
      -> FROM pet, event
      -> WHERE pet.name = event.name AND 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列。查询使用WHERE子句基于name值来匹配2个表中的记录。
      * 因为name列出现在两个表中,当引用列时,你一定要指定哪个表。把表名附在列名前即可以实现。
你不必有2个不同的表来进行联结。如果你想要将一个表的记录与同一个表的其它记录进行比较,可以将一个表联结到自身。例如,为了在你的宠物之中繁殖配偶,你可以用pet联结自身来进行相似种类的雄雌配对:
mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
      -> FROM pet AS p1, pet AS p2
      -> WHERE 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        |
+--------+------+--------+------+---------+
在这个查询中,我们为表名指定别名以便能引用列,并且使得每一个列引用与哪个表实例相关联显得更直观。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值