資料庫系統概論第 七章 混合查詢操作   上一頁   

7-3 專題研討

內容:

  • 7-3 專題研討

  • 7-4 綜合練習

(A) 程式功能:Ex7_4

請查詢選修『粘添壽』老師所開的『資料庫管理系統』學生的名冊,請依照班級名稱、姓名、性別,以及電話等順序印出。

(B) 系統分析:

此題目我們在第六章做過(Ex6_7),它牽涉到六個資料表,如下圖所示。首先必須由 all_course teachers 兩表格中查詢到『資料庫管理系統』的課程代碼(course_ID),『粘添壽』老師的教師代碼(teacher_ID),再利用這兩個代碼由 open_course 表中查詢出開課代碼(open_course_ID)。接著,利用 open_course_ID select_course 表中查詢出有哪些學生(student_ID)選修該課程,再利用選課學生的 stucent_ID,由 students 表中查詢出學生的相關資料。

(C) 程式範例:

我們利用混合查詢法,一步接一步產生小表格合併,如下:

  • 步驟 1首先由 teachers all_course 兩表格中查詢出,『粘添壽』老師與資料庫管理系統』的代碼,再由 open_course 表格中,查出開課代碼 (open_course_ID),如下:

Select C.open_course_ID

From (Select teacher_ID

            From teachers

            Where name = "粘添壽") as A,

           (Select course_ID

             From all_course

             Where course_name = "資料庫管理系統") as B,

           open_course as C

where A.teacher_ID = C.teacher_ID

And B.course_ID = C.course_ID

上述程式合併了 {teacher_ID} as A, {course_ID} as B open_course 等三個表格,前兩個都僅有一筆資料,產生負荷不會很大。

  • 步驟 2找到開課代碼 open_course_ID後,再由 select_course 表中查詢出有哪些學生修課的 student_ID,如下:

Select E.student_ID

From (Select C.open_course_ID

           From (Select teacher_ID

                      From teachers

                      Where name = "粘添壽") as A,

                     (Select course_ID

                      From all_course

                      Where course_name = "資料庫管理系統") as B,

                      open_course as C

        where A.teacher_ID = C.teacher_ID

        And B.course_ID = C.course_ID) as D, select_course as E

Where D.open_course_ID = E.open_course_ID;

  • 步驟 3找到修課學生的 student_ID後,再由 students 表中查詢出學生的相關資料,如下:

Select G.name, G.class_ID, G.sex, G.tel

from  (Select E.student_ID

           From (Select C.open_course_ID

                       From (Select teacher_ID

                                  From teachers

                                   Where name = "粘添壽") as A,

                                   (Select course_ID

                                    From all_course

                                    Where course_name = "資料庫管理系統") as B,

                                    open_course as C

                        where A.teacher_ID = C.teacher_ID

                        And B.course_ID = C.course_ID) as D, select_course as E

           Where D.open_course_ID = E.open_course_ID) as F, students as G

Where F.student_ID = G.student_ID ;

    

  • 步驟 4接著,再與 classes 表合併找出班級名稱,如下:

Select I.class_name, H.name, H.sex, H.tel

From (Select G.name, G.class_ID, G.sex, G.tel

          from  (Select E.student_ID

                     From (Select C.open_course_ID

                               From (Select teacher_ID

                                           From teachers

                                           Where name = "粘添壽") as A,

                                            (Select course_ID

                                              From all_course

                                              Where course_name = "資料庫管理系統") as B,

                                             open_course as C

                                where A.teacher_ID = C.teacher_ID

                                And B.course_ID = C.course_ID) as D, select_course as E

                    Where D.open_course_ID = E.open_course_ID) as F, students as G

             Where F.student_ID = G.student_ID) as H, classes as I

Where H.class_ID = I.class_ID ;

(D) 問題:

雖然混合查詢可以解決合併查詢所產生系統負荷的問題,但所產生的動態資料表很難與子查詢連結。在下一章介紹另一種更直接的方法,即是將所產生的動態資料表暫存起來,當合併完成之後,再將所產生的暫時資料表刪除,即可以解決此問題。

7-4 綜合練習

(A) 請查詢『進四資管二丙』這學期開了哪些課程,請依照課程名稱、必選修、學分數與授課教師之順序印出。

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: