5、MySQL 8.0參考手冊 3.3.4.9使用多個表


pet表跟蹤該寵物的你。如果你想記錄關於他們的其他信息,比如他們生活中的事件,比如訪問獸醫或者懷胎出生時,你需要另一張桌子。這張桌子應該是什么樣子?它需要包含以下信息:

  • 寵物名稱,以便您知道每個事件所屬的動物。

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

  • 用於描述事件的字段。

  • 事件類型字段,如果您希望能夠對事件進行分類。

鑒於這些考慮, 表格CREATE TABLE聲明event可能如下所示:

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

pet表一樣,通過創建包含以下信息的制表符分隔的文本文件來加載最初的記錄是最容易的。

名稱 日期 類型 備注
蓬松 1995年5月15日 4只小貓,3名女性,1名男性
巴菲 1993-06-23 5只小狗,2只雌性,3只雄性
巴菲 1994年6月19日 3只小狗,3只女性
1999年3月21日 獸醫 需要的喙伸直
1997年8月3日 獸醫 斷肋
鮑澤 1991年10月12日 狗窩  
1991年10月12日 狗窩  
1998年8月28日 生日 給他一個新的咀嚼玩具
1998年3月17日 生日 給他一個新的跳蚤項圈
惠斯勒 1998年12月9日 生日 第一個生日

像這樣加載記錄:

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

根據您從pet表中運行的查詢獲知的內容,您應該能夠對event表中的記錄執行檢索 原則是一樣的。但是,event桌子本身何時不足以回答您可能會問的問題?

假設你想要找出每只寵物有其窩的年齡。我們之前看到如何計算兩個日期的年齡。母親的垃圾日期在 event表格中,但為了計算她在該日期的年齡,您需要她的出生日期,該日期存儲在pet表格中。這意味着查詢需要兩個表:

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

這個查詢有幾點需要注意:

  • FROM子句加入兩個表,因為查詢需要從兩者中提取信息。

  • 從多個表合並(加入)信息時,您需要指定一個表中的記錄如何與另一個表中的記錄相匹配。這很容易,因為他們都有name專欄。該查詢使用一個ON子句根據這些name匹配兩個表中的記錄

    該查詢使用一個INNER JOIN來組合這些表。一個INNER JOIN或者從表許可證行當且僅當兩個表滿足所規定的條件,以顯示在結果 ON子句。在這個例子中, ON子句指定 name列中的 pet表必須的匹配 name列 event表。如果一個名稱出現在一個表中,而另一個不出現,則該行不會出現在結果中,因為該ON 子句中的條件失敗。

  • 由於該name列出現在兩個表中,因此您必須具體說明在引用列時您的意思。這是通過將表名添加到列名中來完成的。

您不需要有兩個不同的表來執行連接。如果要將表中的記錄與同一表中的其他記錄進行比較,有時將自己的表加入表是非常有用的。例如,要在您的寵物中找到育種配對,您可以將其pet與自己一起加入表以生成候選對的類似物種的男性和女性:

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 p2.sex = 'm';
+--------+------+--------+------+---------+
| name | sex | name | sex | species |
+--------+------+--------+------+---------+
| Fluffy | f | Claws | m | cat |
| Buffy | f | Fang | m | dog |
| Buffy | f | Bowser | m | dog |
+--------+------+--------+------+---------+

在這個查詢中,我們指定表名的別名來引用列,並保持每個列引用與表關聯的表的哪個實例。本文翻譯由北大青鳥學校開發小組


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com