資料庫程式設計 – PHP+MySQL 第 八章 合併查詢程式       下一頁

 

第八章 合併查詢程式

 

8-1 關聯式集合運算

內容:

無論是資料庫內所儲存的資料表,或是經過查詢(Select) 處理後的結果,都是以表格型態展示,一般稱之為『關聯』(Relation)。從資料庫系統理論上推演,這些關聯可以當數學的變數一樣拿來做運算(譬如,加、減、乘、除),執行結果也是一個關聯。『關聯』是一種集合變數,其運算工具(統稱為運算子)稱之為『關聯式代數』。許多資料庫專家們研究出成千上百的關聯式運算子,其實可用的沒有幾種,我們列出幾個可以實現的運算子,知道箇中滋味,對寫資料庫程式設計稍有幫助。(以下不稱關聯,稱為表格比較貼切)

8-1-1 卡笛生乘積

卡笛生乘積 (Cartesian Product) (×) 將表格之間做全部可能的集合,結果還是一個表格。如圖 8-1,假設 teachers × department,但 teachers 表格有8 個欄位 20 筆資料、department 表格有 2 欄位 11 筆資料,運算後結果有220 (20 * 11) 筆資料,每筆資料有10(8 + 2) 個欄位。

8-1 乘積運算

乘積運算可以找出兩個(或以上)表格之間任何可能的集合,最容易萃取出所要的訊息,但他必須付出昂貴的成本。上述範例中 teachers department 各有 20 筆與 11 筆資料,就得到了 220 (20 *11),一般資料庫內的資料表至少有上萬筆,如果兩個上萬筆資料的表格相乘的話,可能得到上億筆資料,可能會造成系統當機。因此,它雖然非常好用,但盡可能不要用(本書會傳授更好的方法),譬如 teachers department 兩表格做乘機運算的 SQL 語法如下:

Select *

From teachers, department;

8-1-2 合併運算

合併運算(Join)的符號是 ρp(R) R where (P),其中 P 表示選取條件、R 可以是資料表(單一表格稱選取運算(select))或運算後結果。譬如要找出全校系主任名單(ρtitle=”系主任(teachers × department) R where title=”系主任 (P)),則SQL 語法如下:

Select *

From teachers, department

Where title=”系主任”;

則輸出為:

表示在(teachers × department) 輸出表格中,再選取滿足 title = “系主任條件的記錄,可以看出每筆記錄還是有 10 個欄位。

8-1-3 投影運算

投影運算(Project)的符號是 πA1, A2, A3, ..(R)R[A1, A2, A3, …],其中 A1, A2, A3, .. 表示投影欄位(或稱屬性)R 為表格可以是資料表或運算後結果。譬如要找出全校系主任名單(ρtitle=”系主任(teachers × department)),但僅顯示(投影)系別(dep_name)、姓名(name)與電話(tel),則關聯代數為(πdep_name, name, tel,..(ρtitle=”系主任(teachers × department)),則SQL 語法如下:

Select dep_name, name, tel

From teachers, department

Where title=”系主任”;

則輸出為:(僅列出部分結果)

這樣的結果好像不對,一位老師當了許多系的系主任,我們回顧 teachers 表內以 dep_ID 登錄該老師屬於哪一系,又 department 表內的 dep_ID 記錄哪一系對應的系別名稱(dep_name),如果我們能由(πdep_name, name, tel,..(ρtitle=”系主任(teachers × department)),再增加選取 teachers.dep_ID = department.dep_ID ( A.dep_ID = B.dep_ID 取代)就可選取到各系的系主任,則SQL 語法如下:

Select dep_name, name, tel

From teachers as A, department as B

Where title=”系主任

And A.dep_ID = B.dep_ID;

則輸出為:(僅列出部分結果)

8-1-4 其它運算子

除了上述關聯式運算子之外,還有下列運算式,但本書範例沒用到,請讀者有機會使用時,再自行 Google 一下就好,如下:

(A) 聯集運算(Union)兩個表格之間記錄做聯集(OR 運算),但兩表格的欄位名稱與數量必須相同(同性質)

Select name, tel, address

From teachers

Union

Select name, tel, address

From students;

第一個與第二個查詢皆選取 name, tel address 等欄位內容,再將兩查詢結果的暫存表格聯集(OR 運算)成一個表格。

(B) 交集運算(Intersection)兩個表格之間的記錄做交集 (AND 運算),但兩表格的欄位名稱與數量必須相同(同性質)

Select name, tel, address

From teachers

Intersection

Select name, tel, address

From students;

(C) 差集運算(Minus)兩表格之間的記錄做相減運算(減法運算) ,但兩表格的欄位名稱與數量必須相同(同性質)

Select name, tel, address

From teachers

Minus

Select name, tel, address

From students;

(D) 除法運算(Divide)兩表格之間的記錄做除法相除運算(亦即減法運算) ,但兩表格的欄位名稱與數量必須相同(同性質)

翻轉工作室:粘添壽

course_db 關聯圖

 

資料庫程式設計 - PHP+MySQL:

 

 

 

翻轉電子書系列: