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

6-3 兩表格合併查詢

內容:

  • 6-3-1 表格合併語法

  • 6-3-2 範例研討:查詢各系系主任

  • 6-3-3 範例研討:查詢班級名冊

  • 6-3-4 範例研討:查詢系所課程規劃

  • 6-3-5 範例研討:表格與自己合併

  • 6-3-6 自我挑戰:查詢各系班級名稱

6-3-1 表格合併語法

內部合併又稱為『條件式合併』,也就是交叉合併再加上倆資料表之間的『條件限制』,或稱為『對應』關係的合併。也就是說,兩資料表之間必定存在一個或多個屬性的『比較關係』,包括相等(=)、不相等(<>)、大於(>)、小於(<)、等等符號。

內部合併語法如下:

SELECT A.欄位, …, B.欄位, …

From資料表_1 as A, 資料表_2 as B, …

Where <條件判斷>;

輸出虛擬表格的欄位數量與交叉合併相同,但資料筆數僅滿足條件部分,如下圖所示:

6-3-2 範例研討:查詢各系系主任

(A) 程式功能:Ex6_2

請查詢出各系主任資料,列印出:系別名稱、系主任姓名、電話與地址。

(B)系統分析:

系別名稱是登錄在 department 表內,至於誰是系主任,則登錄在 teachers 表中 title =系統主任,他們之間是利用 dep_ID 欄位關聯。

(C)程式範例:

  • 步驟 1找出系主任的教師資料。

Select *

From teachers as A, department as B

Where A.title = "系主任";

我們可以發現,虛擬表格也是 10 個欄位 (department + teachers),但資料筆數還非常多。原因是每位系主任的資料還交叉混合到其他系資料內,因此需資料另一個過濾條件。

  • 步驟 2增加 teachers.Dep_ID = department.Dep_ID 條件,如下:

Select *

From teachers as A, department as B

Where A.title = "系主任"

And A.Dep_ID = B.Dep_ID;

已可以過濾取得各系主任資料,但並非所有資料都要輸出,僅擷取部分資料即可,如下:

  • 步驟 3擷取所需欄位,如下:

Select dep_name, name, tel, address

From teachers as A, department as B

Where A.title = "系主任"

And A.Dep_ID = B.Dep_ID;

  • 步驟 4:改成多重子查詢練習

Select (select dep_name from department where dep_ID = A.dep_ID) as "系別名稱",

             name, tel, address

From teachers as A

Where title = "系主任";

6-3-3 範例研討:查詢班級名冊

(A) 程式功能:Ex6_3

請查詢『進四資管二丙』班級學生名冊,請列印出:班別名稱、姓名、性別、電話與地址。

(B) 系統分析:

全校學生資料是登錄在 students 表內,至於是哪一班級的學生,則利用 class_ID 標示,但 class_ID 對應到班級名稱則登錄在 classes 表內。因此, students.class_ID classes.class_ID 之間建立了關聯。

(C) 程式範例:

  • 步驟 1找出進『進四資管二丙』班級內學生資料。

Select *

From students as A, classes as B

Where A.class_ID = B.class_ID

And B.class_name = "進四資管二丙";

我們可以發現,虛擬表格也是 11 個欄位 (students + classes),但資料筆數還非常多。原因是每位系主任的資料還交叉混合到其他系資料內,因此需資料另一個過濾條件。

  • 步驟 2擷取所需欄位,如下:

Select class_name, name, sex, tel, address

From students as A, classes as B

Where A.class_ID = B.class_ID

And B.class_name = "進四資管二丙";

  • 步驟 3:改成多重子查詢練習

Select (select class_name from classes where class_ID = A. class_ID) as "班級",

        name, sex, tel, address

From students as A

Where class_ID = (Select class_ID

                                From classes

                                Where class_name = "進四資管二丙");

6-3-4 範例研討:查詢系所課程規劃資料

(A) 程式功能:Ex6_4

請查詢『資訊管理系』全學年規劃有那些課程,請依照:系別名稱、課程代碼、課程名稱、學分數、必選修之順序印出。

(B) 系統分析:

全校各系所規劃的課程全部登錄於 all_course 表內,但該表以 dep_ID 標示哪一系所規劃之課程,又 dep_ID 對應到哪一夕,則登錄於 department 表內。因此,我們將 all_course department 兩表個合併後,取 department.dep_ID = all_course.dep_ID,必且過濾 depart_name = “資訊管理系,如下圖所示。

 (C) 程式範例:

  • 步驟 1department all_course 兩表格內部合併結果如下:

Select *

From department as A, all_course as B

Where A.dep_ID = B.dep_ID

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

  • 步驟 2擷取所需欄位,如下:

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 = "資訊管理系";

  • 步驟 4:改成多重子查詢練習

請自行練習

6-3-5 範例研討:表格與自己合併

(A) 程式功能:Ex6_5

請查詢全校內姓名相同的學生。

(B) 系統分析:

全校學生資料都登錄於 students 資料表內,將該表格自我合併,找出姓名相同,但學號不同的學生,印出其資料即是。

(C) 程式範例:

Students 表格自我合併語法如下:

Select A.*

From students as A, students as B

Where A.name = B.name

And A.student_ID <> B.student_ID;

6-3-6 自我挑戰:查詢各系班級名稱

(A) 程式功能:PM6_1

查詢『資訊管理系』有哪些班級,並印出系別名稱、班級代碼與班級名稱,查詢結果如下:

 (B) 系統分析:

全校班級都登錄於 classes 表內,並且 dep_ID 標示是屬於哪一系別,但 dep_ID 對應到系別名稱則登錄於 department 表內。則必須將 classes department 兩表交叉合併如下:

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: