MySQL 教材:有條件接合

根據前一節的範例,我們明白

select name, addr, ADDR.id, zip, streetno from LIST join ADDR;
應該獲得以下 12 筆資料
+--------+------+----+------+--------------------------------+
| name   | addr | id | zip  | streetno                       |
+--------+------+----+------+--------------------------------+
| 郭靖   |    1 |  1 |    5 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 黃蓉   |    1 |  1 |    5 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 周伯通 |    2 |  1 |    5 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 歐陽鋒 |    3 |  1 |    5 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 郭靖   |    1 |  2 |  339 | 府前路 218 號                  |
| 黃蓉   |    1 |  2 |  339 | 府前路 218 號                  |
| 周伯通 |    2 |  2 |  339 | 府前路 218 號                  |
| 歐陽鋒 |    3 |  2 |  339 | 府前路 218 號                  |
| 郭靖   |    1 |  3 |   75 | 月眉里 9 鄰 103 號             |
| 黃蓉   |    1 |  3 |   75 | 月眉里 9 鄰 103 號             |
| 周伯通 |    2 |  3 |   75 | 月眉里 9 鄰 103 號             |
| 歐陽鋒 |    3 |  3 |   75 | 月眉里 9 鄰 103 號             |
+--------+------+----+------+--------------------------------+
這個結果雖然符合數學定義,但是實在很難想像,究竟有什麼意義? 因此,實際上,很少有人需要整個接合的表格,而是要在接合後的表格中, 取得需要的幾筆資料。因此,就需要 where 子句,從這個接合的表格中, 抽取需要的資料。

例如我們想要列出 LIST 表格中每個人的地址,可以這樣做

select name, zip, streetno from LIST join ADDR where LIST.addr = ADDR.id;
MySQL 的工作程序如下:
  1. 做 LIST join ADDR 產生一張臨時表格。
  2. 在臨時表格中執行 where 子句, 抽出 LIST 中 addr 欄位的值與 ADDR 中 id 相同者。
  3. 在抽出的資料中,挑選需要的欄位,列印。
因為郭靖的地址是 ADDR 表格中第一筆資料,黃蓉也是, 周伯通的地址是 ADDR 表格中第二筆資料, 歐陽鋒的地址是 ADDR 表格中第三筆資料, 所以我們使用上述指令。請比照前面那個查詢的結果,找出 LIST.addr = ADDR.id 的資料,得到
+--------+------+--------------------------------+
| name   | zip  | streetno                       |
+--------+------+--------------------------------+
| 郭靖   |    5 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 黃蓉   |    5 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 周伯通 |  339 | 府前路 218 號                  |
| 歐陽鋒 |   75 | 月眉里 9 鄰 103 號             |
+--------+------+--------------------------------+

但是,我們還不滿意,因為 ADDR 中的 zip 欄位,並不是真的郵遞區號, 也沒有寫出郵遞區域的地址,它其實是指 ZIP 表格中的第幾筆資料。 因此,我們其實需要接合 LIST, ADDR, ZIP 三張表格, 搜尋 LIST.addr = ADDR.id 而且 ADDR.zip = ZIP.id 的資料, 並且列印我們需要的資訊:姓名、郵遞區號、縣市、地區、街道地址。 指令應該是

select name, ZIP.zip, zone, area, streetno
from LIST join ADDR join ZIP
where LIST.addr = ADDR.id and ADDR.zip = ZIP.id;
如我們所料,得到結果
+--------+------+--------+--------+--------------------------------+
| name   | zip  | zone   | area   | streetno                       |
+--------+------+--------+--------+--------------------------------+
| 郭靖   |  106 | 臺北市 | 大安區 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 黃蓉   |  106 | 臺北市 | 大安區 | 忠孝東路四段 18 巷 5-1 號 9 樓 |
| 周伯通 |  970 | 花蓮縣 | 花蓮   | 府前路 218 號                  |
| 歐陽鋒 |  320 | 桃園縣 | 中壢   | 月眉里 9 鄰 103 號             |
+--------+------+--------+--------+--------------------------------+

習題

[BCC16-A]
單維彰 (01/05/31) ---
[Prev] [Next] [Up]