的宠物
表格记录了你养的宠物。如果你想记录它们的其他信息,比如它们生活中的事件,比如去看兽医或幼崽出生的时间,你需要另一张表。这张桌子应该是什么样子?它需要包含以下信息:
宠物的名字,这样你就知道每个事件与哪个动物有关。
一个日期,以便您知道事件发生的时间。
描述事件的字段。
一个事件类型字段,如果您希望能够对事件进行分类。
考虑到这些因素,创建表
声明的事件
表可能看起来像这样:
创建表事件(名称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 | | | |米狗 | +--------+------+-------+------+---------+
在这个查询中,我们为表名指定别名以引用列,并保持每个列引用与表的哪个实例相关联。