資料庫系統概論第 六章 合併查詢操作   上一頁    下一頁

6-4 多表格合併查詢

內容:

  • 6-4-1 範例研討:查詢教師開課課程

  • 6-4-2 範例研討:同上題 - 巢狀查詢

  • 6-4-3 自我挑戰:查詢學生選課資料

  • 6-4-4 自我挑戰:查詢開課班級與教師

許多查詢條件必須兩個以上表格合併而成,牽涉到問題就比較複雜,我們用幾個實例來介紹。

6-4-1 範例研討:查詢教師開課課程

(A) 程式功能:Ex6_6

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

(B) 系統分析:

這題目看起來稀鬆平常,但做出來可不簡單。全校所開的課程都登錄於『open_course』表內,但它僅記錄教師代碼(teacher_ID),因此我們必須由『teachers』表得知粘添壽老師的代碼多少。另外,它也僅登錄課程代碼(course_ID),我們還需結合『all_course』才知道所開課程的名稱與相關資料。 還有班級資料登錄於 classes 表格內,由此可見,此問題牽涉到 4 個表格,但合併表格時,我們只要擷取有用到的欄位就好,這樣產生的虛擬表格就不會太大。

(C) 程式範例:

  • 步驟 1先由 teachers open_course 兩表格中查詢出,粘添壽老師開了那些課程,以及其班級,如下:

Select A.course_ID, A.class_ID

From open_course as A, teachers as B

where A.teacher_ID = B.teacher_ID

And B.name = "粘添壽";

  • 步驟 2再合併 all_course 表,取出課程資料,如下:

           

Select A.course_ID, C.course_name, C.required, C.credit, A.class_ID

From open_course as A, teachers as B, all_course as C

where A.teacher_ID = B.teacher_ID

And B.name = "粘添壽"

And A.course_ID = C.course_ID;

  • 步驟 3再合併 classes 取出班級資料,如下:

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

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

where A.teacher_ID = B.teacher_ID

And B.name = "粘添壽"

And A.course_ID = C.course_ID

And A.class_ID = D.class_ID;

6-4-2 範例研討:同上題 - 巢狀查詢

(A) 程式功能:Ex6_7

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

(B) 系統分析:(同上題分析)

         

(C) 程式範例:

l   步驟 1先由 teachers open_course 兩表格中查詢出,粘添壽老師開了那些課程,以及其班級,如下:

select course_ID, class_ID

from open_course

where teacher_ID = (select teacher_ID

                                  from teachers

                                  where name = "粘添壽");

l   步驟 2我們得到了粘添壽老師開課的班級代碼與課程代碼後,利用課程代碼由 all_course 表查詢出該課程的相關資料,如下:

select course_ID, course_name, required, credit

from all_course

where course_ID in (select course_ID

                                  from open_course

                                 where teacher_ID = (select teacher_ID

                                                                    from teachers

                                                                    where name = "粘添壽"));

得到結果如下:

上述結果並沒有得到該門課開在哪一個班級的班級代碼(class_ID),吾人需要再增加得到班級代碼的查詢語句。

l   步驟 3 (很難達成)接下來,我們必須在最後輸出語句中增加班級代碼,語法如下:

select course_ID, course_name, required, credit, (select class_ID

                                                                       from open_course

                                                                       where teacher_ID = (select teacher_ID

                                                                                                      from teachers

                                                                                                      where name = "粘添壽"))

from all_course

where course_ID in (select course_ID

                             from open_course

                             where teacher_ID = (select teacher_ID

                                                           from teachers

                                                           where name = "粘添壽"));

上述語法無法執行,原因是兩個子查詢都可能是一個以上的結果,因此無法匹配。由此可見,該題很難由巢狀查詢方法得到結果,利用合併查詢較容易。

6-4-3 自我挑戰:查詢學生選課資料

(A) 程式功能:PM6_3

查詢學號 = 90211306』同學,這學期修了那些課程,請依照開課班級名稱、課程名稱、學分數、必選修之順序印出,查詢結果如下:

(B) 系統分析:

全校學生選課情況都登錄於 select_course 表格內。吾人可利用學生學號由此表格中查詢出他修讀哪門課的 open_course_ID,再利用 open_course_ID open_course 表中查詢出課程代碼(course_ID) 、班級代碼(class_ID) 開課教師的代碼( teacher_ID),再分別由 all_course classes表格中查詢他們的名稱,如下圖所示。

            

6-4-4 自我挑戰:查詢開課班級與教師

(A) 程式功能:PM6_4

請查詢這學期是否有開『資料庫管理系統』課程,請列印出課程代碼、開課班級及開課教師資料。查詢結果如下:

(B) 系統分析:

首先須由 all_course 表中查詢出『資料庫管理系統』的課程代碼(course_ID),再利用它由 open_course 表中查詢出該課程開在哪一班(class_ID)與哪位老師(teacher_ID) 開的,再由 teachers classes 表中查詢出它的名稱,如下圖所示。

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: