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

第六章 合併查詢操作

6-1 合併的基本觀念

內容:

  • 6-1 合併的基本概念

  • 6-2 交叉合併

所謂『合併』(Join)就是 2 個以上表格結合成一個虛擬表格。由此虛擬表格查詢出所要的訊息。這與第三章、第四章介紹的有很大的差別,第四章僅對一個表格做查詢動作,第五章是一個表格接一個表格的連續查詢動作,雖然各個查詢語句針對不同的表格,但每一次都僅查詢一個表格。然而,合併查詢就不一樣了,一次可能針對 2 個以上的表格查詢,並且讓這些表格之間做運算。

其實,合併查詢僅是一個重要的觀念而已,在實務上我們幾乎不會利用原始資料表之間合併運算來得到訊息,因為它產生的資料量非常大,會降低資料庫的效能。一般我們會將合併查詢轉換成子查詢來運作,不然就是經過子查詢後得到比較小的動態資料表,再利用它來合併查詢,以減少資料產生。

6-1 合併表格的概念

上圖為兩個表格之間做合併動作,假設資料表_A 20 筆資料,每一筆資料有 5 個欄位 {20, 5};資料表_B 30 筆資料,每一筆資料有 4 個欄位 {30, 4},兩者合併後產生的虛擬表格有 20 * 30 =600 筆資料,每一筆有 5 + 4 = 9 個欄位 {600, 9}。以目前資訊時代裡,一個資料表至少有上萬筆資料,兩個資料表座合併查詢,則有可能上億筆資料,如果 2 個以上表格合併查詢,那保證讓會電腦當機。但話說回來,我們還是需要利用合併查詢來得到所要的訊息,只不夠使用方法要有所改變而已。

表格之間交叉合併之後,如何由虛擬表格中擷取訊息,就延伸了幾種類型,可分為『交叉合併』(Cross join)、『內部合併』(Inner join)、『外部合併』(Outer join,未介紹)與『自我合併』(Self join)等四大類。我們先介紹這幾種合併類型的特性,再取一些範例來探討合併的運用,下一章再介紹如何將優化合併查詢。

表格之間合併查詢語句如下:

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

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

Where <A.欄位 | B.欄位條件判斷>;

由上述語句中可以看出,我們可以 2 個以上資料表之間的查詢,並且每一個資料表給與一個 AB或其它字元做代號,Where 條件判斷還是採用各個資料表欄位的內容,並由各個參與合併資料表的欄位擷取所要的訊息。

6-2 交叉合併

6-2-1 交叉合併的運作

交叉合併又稱為卡式積(Cartesian Product)合併是表格之間最基本的運算,功能是取表格之間所有可能的集合,也就是圖 6-2 所示。假設資料表_A 大小是 {L, m},表示有 L 筆資料,每筆資料有 m 個欄位;資料表_B 的大小是 {K, n},兩表格經過卡式積合併後產生的虛擬表為 {L*K, m+n},有 L*K 筆資料,則每幾資料有 m+n 個欄位。

6-2 卡式積合併結果

6-2-2 交叉合併的範例

(A)程式功能:Ex6_1

查詢教師資料表(teachers)與系所資料表(department)之間可能的集合。

(B)系統分析:

教師資料表 teachers={teacher_ID, name, Dep_ID, sex, tel, title, mailbox, address},與系所資料表 department = {dep_ID, dep_name} 兩者合併後,其虛擬表格有 (teacher_ID, name, teachers.Dep_ID, sex, tel, mailbos, address, department.dep_ID, dep_name) 10 欄位。如果 teachers 10 筆資料,系department 6 筆資料的話,合併後會產生 10 * 6 = 60 筆資料的虛擬表格。

(C)程式範例:

Select *

From teachers, department;

(D)執行結果:(僅顯示部分內容)

當然,我們也可以由上圖中擷取某些欄位,但系統的運作還是產生了龐大的虛擬表再來擷取,所佔用的記憶體空間還是很大。

翻轉工作室:粘添壽

 

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

 

 

翻轉電子書系列: