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

7-2 範例研討:混合查詢

內容:

  • 7-2-1 範例研討:查詢學生修課成績

  • 7-2-2 範例研討:查詢教師開課與班級

7-2-1 範例研討:查詢學生修課成績

(A) 程式功能:Ex7_2

請查詢學號 90211302 學生這學期修了哪些課,以及成績。請印出課程名稱、分數。

(B) 系統分析:

讓學生查詢自己修課成績,看起來是稀鬆平常的題目,但要完成它並不容易,甚至僅利用多重子查詢無法做到(學生可自行做看看,做出來加分)。如果不要印出課程名稱,只印出課程代碼或開課代碼,那就非常容易。首先,我們來看它的資料流程如何?利用學號 90211302 select_course 表中查詢出該生這學期修了那些課(open_course_ID),以及成績。再由 open_course 表中查詢出課程代號(course_ID),再由 all_course 表中查詢出所修課程的名稱。

(C) 程式範例:

  • 步驟 1首先利用學號 90211302 select_course 表中查詢出該生修了那些課程與成績,如下:

Select open_course_ID, final

From select_course

Where student_ID = "90211302";

  • 步驟 2得到上述表格後({open_course_ID, final},再與 open_course 表合併查詢,得到開課代碼的相對應課程代碼,以及其成績,如下:

Select B.course_ID, A.final

From (Select open_course_ID, final

           From select_course

            Where student_ID = "90211302") as A, open_course as B

Where A.open_course_ID = B.open_course_ID;

  • 步驟 3得到上述表格後({course_ID, final},再與 all_course 表合併查詢,得到課程代碼對應的課程名稱,以及其成績,如下:

Select D.course_name, C.final

From (Select B.course_ID, A.final

          From (Select open_course_ID, final

                      From select_course

                       Where student_ID = "90211302") as A, open_course as B

          Where A.open_course_ID = B.open_course_ID) as C, all_course as D

Where C.course_ID = D.course_ID;

由上述操作可以發現,我們先產生 {open_course_ID, final} as A 表格,再與 open_course as B表格合併,產生 {course_ID, final} as C 表格,再與 all_course as D表格合併,得到 {course_name, final} 的結果。之間都利用一個小表格與資料表合併,如此產生暫存表就不會很大,這就是混合查詢的優點。

7-2-2 範例研討:查詢教師開課與班級

(A) 程式功能:Ex7_3

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

(B) 系統分析:

此題目我們在第六章做過(Ex6_6),它牽涉到四個資料表,如下圖所示。首先 teachers表中查詢出『粘添壽』老師的教師編碼(teacher_ID),再由 open_course 表查出他開了那些課,再經由 all_course classes 表查詢出課程名稱與班級名稱。

(C) 程式範例:

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

  • 步驟 1首先由 teachers查詢出,『粘添壽』老師代碼,再由 open_course 查詢出他開了那些課,如下:(多重子查詢)

Select course_ID, class_ID

From open_course

Where teacher_ID = (Select teacher_ID

                                   From teachers

                                    Where name = "粘添壽");

上述程式產生了 {course_ID, class_ID},每筆資料表示開了某一課程,在某一班級開。

  • 步驟 2接著,我們利用 {course_ID, class_ID} 暫存表與 classes 表合併,找出班級名稱,如下:

select A.course_ID, B.class_name

from (select course_ID, class_ID

from open_course

where teacher_ID = (select teacher_ID

                                               from teachers

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

            classes as B

where A.class_ID = B.class_ID;

上述產生了 {course_ID, class_name} 暫時表格,表示哪一班級開了某一門課(代碼)

  • 步驟 3接著,再利用 {course_ID, class_name} all_course 表合併查詢出課程名稱,如下:

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

From (select A.course_ID, B.class_name

From (Select course_ID, class_ID

From open_course

Where teacher_ID = (select teacher_ID

                                                            From teachers

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

                         classes as B

Where A.class_ID = B.class_ID) as C,

all_course as D

Where C.course_ID = D.course_ID;

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: