5、MySQL 8.0参考手册 3.3.4.9使用多个表

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

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

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

  • 用于描述事件的字段。

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

鉴于这些考虑, 表格CREATE TABLE声明event可能如下所示:

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

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

名称日期类型备注
蓬松1995年5月15日4只小猫,3名女性,1名男性
巴菲1993-06-235只小狗,2只雌性,3只雄性
巴菲1994年6月19日3只小狗,3只女性
1999年3月21日兽医需要的喙伸直
1997年8月3日兽医断肋
鲍泽1991年10月12日狗窝 
1991年10月12日狗窝 
1998年8月28日生日给他一个新的咀嚼玩具
1998年3月17日生日给他一个新的跳蚤项圈
惠斯勒1998年12月9日生日第一个生日

像这样加载记录:

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子句指定 name列中的 pet表必须的匹配 name列 event表。如果一个名称出现在一个表中,而另一个不出现,则该行不会出现在结果中,因为该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     |
+--------+------+--------+------+---------+

在这个查询中,我们指定表名的别名来引用列,并保持每个列引用与表关联的表的哪个实例。本文翻译由北大青鸟学校开发小组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值