MySQL™ 參考手冊(使用多個表)

使用多個表

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


上一篇:計數行

相關文章
相關標籤/搜索