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

第七章 混合查詢操作

 

7-1 子查詢與合併混合查詢

內容:

  •  7-1-1 簡介

  • 7-1-2 範例研討:查詢系別課程設計

  • 7-1-3 自我挑戰:查詢班級名冊

  • 7-1-4 自我挑戰:查詢系所教師名冊

7-1-1 簡介

說實在的,由單一表格上查詢資料的機會並不多,原因是我們建立資料庫時,須考慮他的效益,大多會將一個表格分解成多個表格,再將表格之間建立關聯,才可節省記憶體空間,也能滿足真實環境的變遷。因此,每一個訊息的查詢大多會牽動到 2 個以上表格。到目前為止,對多表格的查詢我們介紹了多重子查詢(第四章),以及表格合併查詢(第五章),多重子查詢常常無法得到滿足的答案,除非訊息之間以串聯方式連接,用合併查詢最容易得到答案,但它所佔用的記憶體空間太大,對於資料量較大的資料庫系統根本無法可行。

兩查詢技巧都有它的優缺點,我們就擷取雙方的優點,思考一種混合式查詢技巧,也就是結合子查詢與合併查詢之功能。還未介紹之前,溫習一下重要的觀念,不管何種查詢技巧,所得到的結果都是一個『動態資料表』。我們的方法就是利用子查詢產生一個較小的『動態資料表』,再來與原資料表合併。或者,資料表合併之前,都先經過子查詢過濾掉一些無關的訊息,產生較精簡的資料表之後再來合併,如此就可以減少許多記憶體空間,執行效率也比較高。

我們再來回顧 SQL Select 查詢語句,如圖 7-1 所示。在select 命令行內( (1)),表示要擷取那些欄位,也可以利用某一子查詢命令將結果填寫於此。又在 From 命令行中( (2)),表示合併那些資料表,但也可以由某一子查詢得到動態資料表來取代。在 Where 命令行中,某一欄位內容如符合某一數值則篩選條件成立,但此數值也可以由某一子查詢得到( (3))。如果我們善加利用此特性,即可達到混合查詢的功能。

7-1 SQL Select 命令的特性

甚至我們可以建立暫存資料表,並將某些查詢後的結果存放於該表,再利用它與其它表格做合併處理,使用完後再將這些暫存表格刪除,如此不但可以提高執行速度,在編寫查詢程式時,也比較不會遇到困難,這方面我們將在下一章介紹。

7-1-2 範例研討:查詢系別課程設計

(A)程式功能:Ex7_1

請查詢『資訊管理系』全學年的課程,請依照課程代碼、課程名稱、必選修、學分數支順序印出。

(B)系統分析:

在我們用合併查詢當然可以得到答案,但必須合併 department all_course 兩資料表,如此可能造成系統負荷,如下圖所示。

Select dep_name, course_ID, course_name, credit, required

From department as A, all_course as B

Where A.dep_ID = B.dep_ID

And A.dep_name = "資訊管理系";

吾人可先由 department 表中查詢出『資訊管理系』的系別編碼 (dep_ID),它只有一筆資料的表格,再與 all_course 表格合併,不但可以找到結果,也不會造成系統負擔。

(C)程式範例:

  • 步驟 1 department 表中找出資訊管理系的代碼 dep_ID

Select dep_ID

From department

Where dep_name = "資訊管理系";

     

  • 步驟 2則將產生的暫存資料表(dep_ID) all_course 表合併查詢,如下:

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

From all_course as A, (Select dep_ID

                                      From department

                                      Where dep_name = "資訊管理系") as B

Where A.dep_ID = B.dep_ID;

7-1-3 自我挑戰:查詢班級名冊

(A) 程式功能:PM7_1

請查詢『進四資管二丙』班級學生名冊,請依照學號、姓名、性別、電話、郵件信箱之順序印出。

(B) 系統分析:

 

7-1-4 自我挑戰:查詢系所教師名冊

(A) 程式功能:PM7_2

請查詢『資訊管理系』教師名冊,請依照、姓名、性別、職務、電話、郵件信箱之順序印出。

(B) 系統分析:

 

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: