pet
表記錄你擁有的寵物,若是你想記錄關於他們的其餘信息,好比他們生活中的事件,好比去看獸醫或者當幼崽出生時,須要另外一張表,這張表應該是什麼樣的?它須要包含如下信息:mysql
考慮到這些因素,event
表的CREATE TABLE
語句可能以下所示:sql
mysql> CREATE TABLE event (name VARCHAR(20), date DATE, type VARCHAR(15), remark VARCHAR(255));
與pet
表同樣,最簡單的方法是經過建立包含如下信息的製表符分隔文本文件來加載初始記錄。segmentfault
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 |
像這樣加載記錄:code
mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;
根據你從pet
表上運行的查詢中學到的內容,你應該可以對event
表中的記錄執行檢索,原則是同樣的,但事件表什麼時候不足以回答你可能會問的問題?事件
假設你想知道每隻寵物生幼仔的年齡,咱們前面看到了如何從兩個日期計算年齡,母親的產仔日期在event
表中,但要計算她在那個日期的年齡,你須要她的出生日期,它存儲在pet
表中,這意味着查詢須要兩個表:ci
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 | +--------+------+-----------------------------+
有關此查詢的注意事項有如下幾點:rem
FROM
子句鏈接兩個表,由於查詢須要從兩個表中提取信息。name
列,該查詢使用ON
子句根據name
值匹配兩個表中的記錄。該查詢使用INNER JOIN
來組合表,當且僅當兩個表都知足ON
子句中指定的條件時,INNER JOIN
才容許來自任一表的行出如今結果中。在此示例中,ON
子句指定pet
表中的name
列必須與event
表中的name
列匹配。若是name
出如今一個表中但不出如今另外一個表中,則該行不會出如今結果中,由於ON
子句中的條件失敗。get
name
列出如今兩個表中,所以你必須具體說明引用該列時你所指的表,這是經過將表名添加到列名稱前面來完成的。你不須要兩個不一樣的表來執行鏈接,若是要將表中的記錄與同一表中的其餘記錄進行比較,有時將錶鏈接到自身會頗有用。例如,要在你的寵物中找到繁殖對,能夠將pet
表與它本身鏈接起來,以生成候選對的活體雄性和相似物種的雌性:it
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 p1.death IS NULL AND p2.sex = 'm' AND p2.death IS NULL; +--------+------+-------+------+---------+ | name | sex | name | sex | species | +--------+------+-------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | +--------+------+-------+------+---------+
在此查詢中,咱們爲表名指定別名以引用列,並保持每一個列引用與表的哪一個實例相關聯。event