接下來,看個更複雜的例子。現在有三張相關的資料表:
list 存放的是中大數學系學生、系友或教職員的資料。
分成六個欄位,各欄的名字和意義如下:
假設現在需要寄公文給所有男性職員(不要問為什麼只給男性,這題目實在不好出)。 因此得查出所有 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 練習資料庫中。建議讀者可以另開一個視窗,實際操作。
習題