MySQL 教材:更多接合搜尋的範例

接下來,看個更複雜的例子。現在有三張相關的資料表:

list 存放的是中大數學系學生、系友或教職員的資料。 分成六個欄位,各欄的名字和意義如下:

  1. id 編號
  2. number 學號,若非學生則是空的
  3. name 姓名
  4. gender 性別,'M' 表示男,'F' 表示女
  5. status 身份,若是值為
  6. addressid 紀錄著在 address 表中所對映的地址
address 則有三欄:
  1. id 編號
  2. zipid 在 ZIP 資料表中的 id,表示所在地區
  3. addressno 亂數取得的虛擬地址
ZIP 有四欄:
  1. id 編號
  2. zip 郵地區號
  3. zone 縣市或特殊區域
  4. area 地區名

假設現在需要寄公文給所有男性職員(不要問為什麼只給男性,這題目實在不好出)。 因此得查出所有 gender 是 M, status 是 S 的人及完整地址,附帶一提, 因為 gender 與 status 都是唯一,就可以不用指定資料表。 利用 list 找出男職員, 接合 address 取得地址, 但在 address 表中只有 zipid, 我們還得接合第三張表格以取得完整的行政區及郵地區號, 所以要得到需要的資料得輸入以下冗長的指令:

select name, zip, zone, area, addressno
from list join address join ZIP
where list.addressid = address.id and address.zipid = ZIP.id
and status = 'S' and gender = 'M';
如我們所料,得到結果
Empty set (0.00 sec)
不!這結果不是我們所想要的...... 它通常代表的是中大數學沒有男職員。也就是說,這是個爛例子。

修正題目,改成寄給學號 90 開頭的碩士班學生。 輸入指令:

select name, zip, zone, area, addressno
from list join address join ZIP
where list.addressid = address.id and address.zipid = ZIP.id
and number like '90%' and status = 'MS';
得到結果
+--------+------+--------+--------+-----------------------+
| name   | zip  | zone   | area   | addressno             |
+--------+------+--------+--------+-----------------------+
| 施柏如 |  928 | 屏東縣 | 東港   | 長溪街543號           |
| 劉彥旻 |  315 | 新竹縣 | 峨眉   | 新生南路268號         |
| 陳志有 |  950 | 台東縣 | 臺東   | 光陽路790號           |
| 林嫻雯 |  325 | 桃園縣 | 龍潭   | 延和路841號-4         |
| 蘇惟倫 |  932 | 屏東縣 | 新園   | 富農街141巷345號7樓   |
| 羅文仁 |  366 | 苗栗縣 | 銅鑼   | 中正路973號           |
| 魏傳昇 |  800 | 高雄市 | 新興區 | 福吉五街45號          |
| 林忠慶 |  634 | 雲林縣 | 褒忠   | 長溪街379號           |
| 呂岳樺 |  202 | 基隆市 | 中正區 | 龍昌路259號           |
| 陳正夫 |  513 | 彰化縣 | 埔心   | 中華南路833巷172號    |
| 巫世榮 |  845 | 高雄縣 | 內門   | 祥和二路937號         |
| 陳孟遠 |  352 | 苗栗縣 | 三灣   | 永福路970號           |
| 吳政訓 |  844 | 高雄縣 | 六龜   | 信一路四段662號       |
| 陳怡樺 |  881 | 澎湖縣 | 西嶼   | 黎明路436巷200弄431號 |
+--------+------+--------+--------+-----------------------+
這次就沒那麼不幸了,可以很清鬆的把資料印出來, 貼到信封上寄出去了!

附註:之後的例子如果有提到 list, address, ZIP 這些資料表, 都是指本節所介紹的,將資料SQL 練習資料庫中。建議讀者可以另開一個視窗,實際操作。

習題

[BCC16-A]
林勁伍 (02/07/11) ---
[Prev] [Next] [Up]