MySQL 9.0 版本說明
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
值比對兩個資料表中的記錄。