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

8-4 多表格結合的 view

內容:

  • 8-4-1 複雜的視界 - 通用課程表

  • 8-4-2 範例研討:查詢班級所開課程

  • 8-4-3 自我挑戰:查詢課程開在那些班級

  • 8-4-4 自我挑戰:查詢授課班成績單

8-4-1 複雜的視界 通用課程表

(A) 系統功能:public_course View

到目前我們認識可以利用 View 來回復原來資料表的抽象格式,但回復功能不僅 simple_students simple_teachers 兩視界範圍而已。我們以 course_db 為例,此資料庫最主要提供系所規畫課程與每學期教師開課、學生選課、登錄成績功能,但有許多複雜關係,歸類如下:

(1) 系所全學年規畫了哪些課程、

(2) 老師在哪一個班級、開哪一門課、

(3) 同一門課,不同老師可能在不同班級開課、

(4) 學生可以隨意選課,不一定在自己班級、

(5) 開課以班級為單位,不列入系所、

(6) 學生同一門課不可同時修 2 次以上、、、等條件限制。

從資料庫邏輯設計(或正規化原則)的觀點,我們為了滿足上述條件,我們將課程相關資料分割為若干個資料表來存放,並在資料表之間建立關聯,這是關聯式資料庫系統的最基本原理。我們用巢狀、合併與混合等技巧就是為了要克服這些雜亂的資料表中萃取資訊之目的。

如果,我們可以建立一個 View 來回復原來需求的資料,摒除掉一些為了滿足正規化所增加的欄位,也許在資料查詢就可以方便許多,然而,它又是一個抽象不存在的表格,也不會破壞原來正規化原則。如下圖所示,我們將 classesopen_courseall_course simple_teachers 等表格合併,找出『這學期』與教師開課全部相關的資料,建立一個 View,如果要查詢系所開課、教師開課、班級開課、課程資料、學生選課、、等等,只要與課程相關的資料都由這個 View 就可以找到。所建立 public_course 視界的結構是 {開課代碼、課程名稱、班級名稱、教師名稱、必選修、學分數}

 (B) 利用 SQL 命令產生 public_course View,語法如下:

Create view public_course as

Select B.open_course_ID, C.course_ID, C.course_name, A.class_name,

D.name as Teacher_name, C.required, C.credit

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

Where A.class_ID = B.class_ID

And B.course_ID = C.course_ID

And B.teacher_ID = D.teacher_ID;

(C) 直接用SQL 驗證該視窗是否滿足需求:

select *

from public_course;

 

8-4-2 範例研討 查詢班級所開課程

(A) 系統功能:Ex8_2

請查詢 "進四資管二丙" 班級這學期開了那些課程,請列出開教師、課程名稱、學分數,以及必選修。

(B) 系統分析

這個題目用原來的系統結構,可需要合併好幾個資料表,我們嘗試使用 public_course 視界來做看看。如下圖所示,我們只要一個查詢語句就可以完成。

 (C) SQL 語法:(查詢進四資管二丙所開的課程)

Select course_ID, course_name, class_name, teacher_name, required, credit

From public_course

Where class_name = “進四資管二丙”;

8-4-3 自我挑戰 查詢課程開在哪些班級

(A) 程式功能:PM8_1

請查詢全校 "資料庫管理系統" 課程開在那些班級。請列出:課程代碼、課程名稱、班級名稱、開課教師名稱。如下:

 (B) 提示:

只要利用課程名稱,在 public_course 視界上就可以查到相關資訊,如下圖所示。

8-4-4 自我挑戰 查詢授課班級成績單

(A) 程式功能:PM8_2

請查詢:粘添壽老師在進四資二丙班級,所開資料庫管理系統課程的學生成績單。結果如下:

(B) 提示:

學生選課與登錄成績 (select_course)並沒有在 public_course 視界內。如下圖所示,執行網頁收到所欲查詢的 3 個資料(course_name, class_name, teacher_name)之後,由 public_course 視界查詢出該課程的開課代碼(open_course_ID),再到 select_course 查詢出修課學生的 student_ID 與成績(final),最後與 simple_students 視界合併查出學生的班級名稱與姓名。

           

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: