相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  使用多個資料表

5.3.4.9 使用多個資料表

pet 資料表會追蹤您擁有的寵物。如果您想要記錄有關牠們的其他資訊,例如看獸醫或生產等生命中的事件,您需要另一個資料表。這個資料表應該長什麼樣子?它需要包含以下資訊:

  • 寵物名稱,以便您知道每個事件屬於哪隻動物。

  • 日期,以便您知道事件何時發生。

  • 描述事件的欄位。

  • 事件類型欄位,如果您想要將事件分類。

考量以上因素,event 資料表的 CREATE TABLE 陳述式可能如下所示:

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

pet 資料表一樣,最簡單的方法是建立包含以下資訊的 Tab 字元分隔文字檔,以載入初始記錄。

名稱 日期 類型 備註
Fluffy 1995-05-15 生產 4 隻小貓,3 隻母貓,1 隻公貓
Buffy 1993-06-23 生產 生產
Buffy 1994-06-19 生產 5 隻小狗,2 隻母狗,3 隻公狗
3 隻小狗,3 隻母狗 1999-03-21 Chirpy 獸醫
需要矯正鳥喙 1997-08-03 Chirpy Slim
獸醫 1991-10-12 肋骨斷裂
Bowser 1991-10-12 肋骨斷裂
Bowser 1998-08-28 犬舍 Fang
生日 1998-03-17 犬舍 給了他一個新的玩具
Claws 1998-12-09 犬舍 生日

給了他一個新的跳蚤項圈

mysql> LOAD DATA LOCAL INFILE 'event.txt' INTO TABLE event;

Whistler

生日

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         |
+--------+------+-----------------------------+

第一個生日

  • 像這樣載入記錄:

  • 根據您從在 pet 資料表上執行的查詢中所學到的知識,您應該能夠在 event 資料表中的記錄上執行擷取;原理相同。但是,event 資料表單獨使用時,何時不足以回答您可能提出的問題?

    假設您想要找出每隻寵物生產時的年齡。我們稍早看到了如何從兩個日期計算年齡。母親的生產日期在 event 資料表中,但是要計算她在那天的年齡,您需要她的出生日期,而該日期儲存在 pet 資料表中。這表示查詢需要兩個資料表。

  • 關於這個查詢,有幾點需要注意:

FROM 子句聯結兩個資料表,因為查詢需要從這兩個資料表擷取資訊。

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     |
+--------+------+-------+------+---------+

在合併(聯結)多個資料表的資訊時,您需要指定如何將一個資料表中的記錄與另一個資料表中的記錄進行比對。這很容易,因為它們都有 name 欄位。查詢使用 ON 子句,根據 name 值比對兩個資料表中的記錄。


查詢使用 INNER JOIN 來合併資料表。只有在兩個資料表都滿足 ON 子句中指定的條件時,INNER JOIN 才允許結果中出現任一資料表的資料列。在此範例中,ON 子句指定 pet 資料表中的 name 欄位必須與 event 資料表中的 name 欄位相符。如果名稱出現在一個資料表中,但未出現在另一個資料表中,則資料列不會出現在結果中,因為 ON 子句中的條件失敗。