資料庫系統概論第 八章 善用 View 視界查詢   上一頁    下一頁

8-3 視界的運用

內容:

  • 8-3-1 視界 - 還原資料表的運用

  • 8-3-2 範例研討:查詢教師開課課程

  • 8-3-3 範例研討:查詢教師授課班名冊

瞭解視界的產生方法之後,接下來我們用幾個範例來說明視界的運用。

8-3-1 視界 - 還原資料表的運用

(A) 視界 simple_students

我們用 students classes 兩張資料表來說明資料庫邏輯設計的問題。如下圖所示,原來記錄學生資料只要如同 org_students 表,裡面登錄了該學生在哪一班(class_name),在哪一系(dep_ID)。但班級名稱每年要修改,譬如今年四資三甲,明年就變成四資四甲,所以每年必須變更每一位學生的資料,這樣設計好像不理想。另外,學生可能轉系或轉班,又必須修改 class_name dep_ID,如果僅修改一個地方也是發生錯誤。因此,為了此正規化原則,我們將它拆解成 students classes 兩張資料表,每年只要修改 classes 內的 class_name,則全校學生資料隨之修改。此設計好像不錯,但延伸了新的問題,我們查詢學生資料時,大多以班級大多以代碼表示,但如要顯示班級名稱時,又要結合 classes 表格才能達成。再思考下一個問題,一般處理學生選課事務時,很少用到地址、電子郵件與電話,何不建立一個 view,來回復原來 org_students 的需求就好,如圖中的 simple_students

在本書 course_db 已建立了此資料表,其結構 {class_ID, student_ID, name, sex}SQL 命令如下:(輸入之前,必須先把原有的刪除)

Create view simple_students as

Select B.class_name, A.student_ID, A.name, A.sex

From students as A, classes as B

Where A.class_ID = B.class_ID;

(B) 視界 simple_teachers

同樣的問題也發生在 teachers department 資料表。如下圖所示,我們將它們回復成 simple_teachers 視界,不但能方便運用,也不會破壞原來的設計原則。

在本書 course_db 已建立了此資料表,其結構 {dep_name, teacher_ID, name}SQL 命令如下:(輸入之前,必須先把原有的刪除)

Create view simple_teachers as

Select B.dep_name, A.teacher_ID, A.name

From teachers as A, department as B

Where A.dep_ID = B.dep_ID

 

8-3-2 範例研討 - 查詢教師開課課程

(A) 系統功能:ExA_1

請查詢『粘添壽』老師這學期開了那些課程,請依照班級名稱、課程名稱、必選修、學分數支順序印出。

(B) 系統分析

此題目,我們在 6-4-1 節討論過,我們改用 simple_teachers 視界來處理,如下:

(C) SQL 命令:

將上圖的關連,以 SQL 命令如下:

Select D.class_name, B.course_ID, C.course_name, C.required, C.credit

From simple_teachers as A, open_course as B, all_course as C, classes as D

where A.name = "粘添壽"

And A.teacher_ID = B.teacher_ID

And B.course_ID = C.course_ID

And B.class_ID = D.class_ID;

 

8-3-3 範例研討 - 查詢教師授課學生名冊

(A) 系統功能:ExA_2

請查詢這學期 "粘添壽" 老師所開 "資料庫管理系統" 課程的學生名冊。

(B) 系統分析

此題目,我們用原資料表做過,現使用 simple_teachers simple_students 兩個 view 表格,來處理看看,下圖是資料表關連圖,假設:查詢選修粘添壽老師所開 "資料庫管理系統" 的學生名冊。

 (C) SQL 命令:(查詢選修粘添壽老師所開 "資料庫管理系統" 的學生名冊)

將上圖的關連,以 SQL 命令如下:

select C.course_name, E.class_name, E.student_ID, E.name, E.sex

from simple_teachers as A,

         open_course as B,

         all_course as C,

         select_course as D,

         simple_students as E

where A.name = "粘添壽"

and A.teacher_ID = B.teacher_ID

and C.course_name = "資料庫管理系統"

and B.course_ID = C.course_ID

and B.open_course_ID = D.open_course_ID

and D.student_ID = E.student_ID;

翻轉工作室:粘添壽

 

資料庫系統概論(含邏輯設計)

 

 

翻轉電子書系列: