7-2
範例研討: 混合查詢
內容:
7-2-1 範例研討:查詢學生修課成績
VIDEO
(A) 程式功能: Ex7_2
請查詢學號 90211302 學生這學期修了哪些課,以及成績。請印出課程名稱、分數。
(B) 系統分析:
讓學生查詢自己修課成績,看起來是稀鬆平常的題目,但要完成它並不容易,甚至僅利用多重子查詢無法做到(學生可自行做看看,做出來加分)。如果不要印出課程名稱,只印出課程代碼或開課代碼,那就非常容易。首先,我們來看它的資料流程如何?利用學號 90211302 由 select_course 表中查詢出該生這學期修了那些課 (open_course_ID),以及成績。再由 open_course 表中查詢出課程代號 (course_ID),再由 all_course 表中查詢出所修課程的名稱。
(C) 程式範例:
Select open_course_ID, final
From select_course
Where student_ID = "90211302";
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;
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 範例研討:查詢教師開課與班級
VIDEO
(A) 程式功能: Ex7_3
請查詢選修『粘添壽』老師這學期開了那些課,請依照班級名稱、課程名稱、必選修、學分數等順序印出。
(B) 系統分析:
此題目我們在第六章做過 (Ex6_6),它牽涉到四個資料表,如下圖所示。首先 teachers表中查詢出『粘添壽』老師的教師編碼 (teacher_ID),再由 open_course 表查出他開了那些課,再經由 all_course 與 classes 表查詢出課程名稱與班級名稱。
(C) 程式範例:
我們利用混合查詢法,一步接一步產生小表格合併,如下:
Select course_ID, class_ID
From open_course
Where teacher_ID = (Select teacher_ID
From teachers
Where name = "粘添壽 ");
上述程式產生了 {course_ID, class_ID},每筆資料表示開了某一課程,在某一班級開。
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} 暫時表格,表示哪一班級開了某一門課 (代碼 )。
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;
翻轉工作室: 粘添壽
資料庫系統概論(含邏輯設計)
翻轉電子書系列: