資料庫操作常需跨表查詢,表間通常透過主鍵與外鍵關聯。以下範例示範如何查詢「某老師管理的學生姓名」。
| 表一:tb1 (學生表) | 說明 |
|---|---|
| studentID (PK) | 主鍵 |
| studentName | 學生姓名 |
| studentGender | 性別 |
| studentAge | 年齡 |
資料樣本:
3102079014 | 劉永相 | 男 | 25
3102079015 | 趙某某 | 男 | 23
| 表二:tb2 (老師表) | 說明 |
|---|---|
| teacherID (PK) | 主鍵 |
| teacherName | 老師姓名 |
| teacherManageStudent (FK) | 管理的學生 ID |
| teacherMemo | 備註 |
資料樣本:
3645221 | 劉剛 | 3102079014 | 備註無
3645222 | 成昆 | 3102079015 | 備註無
使用內聯結(INNER JOIN)關聯兩表:
SELECT tb2.teacherName, tb1.studentName
FROM tb2, tb1
WHERE tb2.teacherManageStudent = tb1.studentID;
結果:
teacherName | studentName
劉剛 | 劉永相
上述設計中,teacherManageStudent 僅能儲存單一學生 ID,無法支援一位老師管理多位學生。兩種解決方案:
在 teacherManageStudent 欄位以特殊符號(如 !)分隔多個學生 ID,應用層拆解後動態產生 SQL。缺點:違反第一正規化、查詢效能差、難以維護資料完整性。
將「老師-學生」關聯獨立為新表 tb3,實現一對多關係:
| 表三:tb3 (老師學生關聯表) |
|---|
| teacherID (FK) |
| teacherManageStudent (FK) |
資料樣本:
3645221 | 3102079014
3645221 | 3102079015 -- 同一老師可管理多位學生
原 tb2 移除 teacherManageStudent 欄位,僅保留老師基本資訊。查詢時三表聯結:
SELECT t2.teacherName, t1.studentName
FROM tb1 t1
JOIN tb3 t3 ON t1.studentID = t3.teacherManageStudent
JOIN tb2 t2 ON t3.teacherID = t2.teacherID;
JOIN 語法替代舊式逗號聯結,提升可讀性與維護性。