相关的文档10bet官方网站 本手册下载 本手册节选

3.3.4.9使用多个表

宠物表格记录了你养的宠物。如果你想记录它们的其他信息,比如它们生活中的事件,比如去看兽医或幼崽出生的时间,你需要另一张表。这张桌子应该是什么样子?它需要包含以下信息:

  • 宠物的名字,这样你就知道每个事件与哪个动物有关。

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

  • 描述事件的字段。

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

考虑到这些因素,创建表声明的事件表可能看起来像这样:

创建表事件(名称VARCHAR(20),日期date,类型VARCHAR(15),备注VARCHAR(255));

宠物表中,通过创建包含以下信息的以制表符分隔的文本文件,最容易加载初始记录。

的名字 日期 类型 备注
毛茸茸的 1995-05-15 垃圾 4只小猫,3只母的,1只公的
巴菲 1993-06-23 垃圾 5只小狗,2只母的,3只公的
巴菲 1994-06-19 垃圾 3只小狗,3只母的
活泼的 1999-03-21 兽医 需要喙直
苗条的 1997-08-03 兽医 破碎的肋骨
加油车 1991-10-12 养犬
1991-10-12 养犬
1998-08-28 生日 给了他一个新的咀嚼玩具
爪子 1998-03-17 生日 给了他一个新的跳蚤项圈
惠斯勒 1998-12-09 生日 第一个生日

像这样加载记录:

mysql>将数据导入到表中

根据您从运行的查询中了解到的情况宠物表中的记录,您应该能够执行检索事件表;原理是一样的。但是什么时候是事件单靠这张表不足以回答你可能会问的问题吗?

假设你想知道每只宠物的产仔年龄。我们在前面看到了如何从两个日期计算年龄。母猫的产仔日期在事件表格,但是要计算她在那个日期的年龄需要她的出生日期,它存储在宠物表格这意味着查询需要两个表:

mysql> SELECT pet.name, TIMESTAMPDIFF(年,出生,日期)作为年龄,备注从宠物内部加入事件在pet.name =事件。类型=“垃圾”;+--------+------+-----------------------------+ | 名字| |评论时代  | +--------+------+-----------------------------+ | 蓬松| 2 | 4只小猫,三女,1男| |巴菲| 4 | 5小狗,2女,3男| |巴菲| 5 | 3的小狗,3女  | +--------+------+-----------------------------+

关于这个查询有几点需要注意:

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

  • 当组合(联接)来自多个表的信息时,您需要指定如何将一个表中的记录与另一个表中的记录相匹配。这很简单,因为它们都有的名字列。查询使用子句来匹配两个表中的记录的名字值。

    查询使用内连接合并表。一个内连接控件中指定的条件时,允许两个表中的行出现在结果中条款。在本例中,子句指定的名字宠物表必须与的名字事件表格如果名称出现在一个表中而没有出现在另一个表中,则该行不会出现在结果中,因为条款失败。

  • 因为的名字列出现在两个表中,在引用列时必须明确指的是哪个表。这是通过在列名前加上表名来实现的。

您不需要有两个不同的表来执行连接。有时,如果您想将表中的记录与同一表中的其他记录进行比较,那么将表与自身连接起来是很有用的。例如,要在你的宠物中寻找繁殖配对,你可以加入宠物表与自己产生候选的一对活的雄性和雌性的同类物种:

SELECT p1.name, p1.name性,p2.name, p2。性,p1。内部连接宠物作为p2在p1上。物种= p2。物种和p1。性= 'f'和p1.死亡是NULL和p2。sex = 'm' AND p2.death IS NULL;+--------+------+-------+------+---------+ | 名字性| | | |性物种  | +--------+------+-------+------+---------+ | 毛茸茸的f | |猫爪子m | | | |巴菲方f | | | |米狗  | +--------+------+-------+------+---------+

在这个查询中,我们为表名指定别名以引用列,并保持每个列引用与表的哪个实例相关联。