探索圖書館文獻數據 與 非圖書館開放關聯數據的 聯 …探索圖書館文獻數據 與 非圖書館開放關聯數據的 聯結點 Exploring the connections between
第五章 關聯式代數 資料庫系統理論與 實務
-
Upload
michaela-sweetman -
Category
Documents
-
view
66 -
download
0
description
Transcript of 第五章 關聯式代數 資料庫系統理論與 實務
第五章 關聯式代數
資料庫系統理論與實務
5-1 簡介 5-2一元關聯操作 5-3二元關聯操作 5-4集合論(Set Theory)操作 5-5聚合函數(Aggregate Functions)計算 5-6綜合查詢
本章內容
關聯式代數就是著重於如何取得資料的過程,也就是重視『 How 』
關聯式計算則著重於要取得什麼資料,也就是重視『 What 』
5-1 簡介
倘若將子關聯 ( 外來鍵 ) 參考父關聯 ( 主要鍵 ) 的關聯性,表示成
『子關聯 ( 外來鍵 ) = 父關聯 ( 主要鍵 ) 』
則圖 5-1 (a) 中的所有關聯性 (Relationship) 如下◦ 訂單 ( 員工編號 ) = 員工 ( 員工編號 )◦ 訂單 ( 客戶編號 ) = 客戶 ( 客戶編號 )◦ 訂單明細 ( 訂單編號 ) = 訂單 ( 訂單編號 )◦ 訂單明細 ( 產品編號 ) = 產品資料 ( 產品編號 )◦ 產品資料 ( 供應商編號 ) = 供應商 ( 供應商編號 )◦ 產品資料 ( 類別編號 ) = 產品類別 ( 類別編號 )
範例資料庫之實體關聯圖
圖 5-1 範例資料庫 (a) 實體關聯圖
員工
圖 5-1 範例資料庫 (b) 員工
客戶
圖 5-1 範例資料庫 (c) 客戶
供應商
圖 5-1 範例資料庫 (d) 供應商
訂單 & 訂單明細
圖 5-1 範例資料庫 (e) 訂單
圖 5-1 範例資料庫 (f) 訂單明細
產品資料 & 產品類別
圖 5-1 範例資料庫 (g) 產品資料
圖 5-1 範例資料庫 (h) 產品類別
關聯式代數可依性質分類為四種◦ 對於單一關聯操作的『一元關聯操作』
(Unary Relational Operation)◦ 對於兩個關聯操作的『二元關聯操作』
(Binary Relational Operation)◦ 以集合論為基礎的『集合論操作』
(Set Theory Operation)◦ 聚合函數 (Aggregate Function) 計算
關聯式代數
5-1 簡介 5-2 一元關聯操作 5-3 二元關聯操作 5-4 集合論 (Set Theory) 操作 5-5 聚合函數 (Aggregate Functions) 計算 5-6 綜合查詢
本章內容
一元的關聯操作主要是針對一個關聯的操作◦ 『選取操作』 (Select Operation)◦ 『投影操作』 (Project Operation)◦ 『更名操作』 (Rename Operation) 。
5-2 一元關聯操作
選取操作 ( SELECT Operation )
屬性 1 屬性 2 屬性 3 屬性 4 屬性 5
A1 B1 C1 D1 E1
A2 B2 C2 D2 E2
A3 B3 C3 D3 E3
A4 B4 C4 D4 E4
A5 B5 C5 D5 E5
A6 B6 C6 D6 E6
屬性 1 屬性 2 屬性 3 屬性 4 屬性 5
A1 B1 C1 D1 E1
A3 B3 C3 D3 E3
A4 B4 C4 D4 E4
圖 5-2 關聯 R 的 SELECT 操作示意圖
有一關聯稱之為 R ,則 SELECT 操作的表示方式如下 σ< 選取條件 >(R)
此處的符號 σ ( 唸成 sigma) ,單一關聯 R 操作 屬於一元關聯操作 (Unary Relational Operation) < 選取條件 > :篩選關聯 R 值組的條件判斷式,有兩種
< 屬性名稱 > < 比較運算子 > < 常數值 > 或 < 屬性名稱 > < 比較運算子 > < 屬性名稱 >
< 屬性名稱 > :關聯 R 中的屬性 < 比較運算子 >
◦ 一個運算子 (Operator) ,比較兩邊是否相等的布林值 (Boolean)◦ 亦可透過不同的邏輯運算子 { NOT, AND, OR } 來連接以上之基本表示
式,以達到邏輯運算的目的
選取操作 ( SELECT Operation )
從員工關聯中挑選出男性員工。 【說明】
◦ 此查詢中,主要是針對員工關聯中的『性別』屬性的屬性值進行篩選動作。
【表示式】 σ (性別 =‘ 男’ )( 員工 )
【範例 5-1 】
圖 5-3 【範例 5-1 】的結果
從員工關聯中挑選出男性業務。 【說明】
◦ 此範例與【範例 5-1 】不同,因為查詢 5-1 只要挑選出性別屬性的屬性值為『男』即可,但此查詢不但是要求『性別』的屬性值為『男』,『職稱』屬性的屬性值也必須是『業務』,也就是兩者條件要同時成立,如圖 5-4 ,選取員工性別為男與職稱為業務的兩者共同之交集
【表示式】 σ (性別 =‘ 男’ AND 職稱 =‘ 業務’ )( 員工 )
【範例 5-2 】
所有員工
男性員工 業務男性業務圖 5-4 AND 的示意圖
圖 5-5 【範例 5-2 】的結果
從員工關聯中挑選男性員工或是職稱為業務之員工 【說明】
◦ 此查詢與【查詢 5-2 】不同,因為查詢 5-2 是要挑選出,同時是男性員工,而且又必須是業務身份。而此查詢卻只要符合其中一個條件者,即可被列出。所以以圖 5-6 而言,是選取符合兩者條件資料之聯集
【表示式】 σ (性別 =‘ 男’ OR 職稱 =‘ 業務’ )( 員工 )
【範例 5-3 】
所有員工
男性員工 業務男性業務
圖 5-6 OR 的示意圖
圖 5-7 【範例 5-3 】的結果
投影操作 ( Project Operation )
屬性 1 屬性 2 屬性 3 屬性 4 屬性 5
A1 B1 C1 D1 E1
A2 B2 C2 D2 E2
A3 B3 C3 D3 E3
A4 B4 C4 D4 E4
A5 B5 C5 D5 E5
A6 B6 C6 D6 E6
屬性 1 屬性 2 屬性 5
A1 B1 E1
A2 B2 E2
A3 B3 E3
A4 B4 E4
A5 B5 E5
A6 B6 E6圖 5-8 關聯 R 的 PROJECT 操作示意圖
有一關聯稱之為 R ,則 PROJECT 操作的表示方式如下
π < 屬性列 >(R)
符號 π ( 唸成 pi) 對單一關聯 R 做操作 歸屬於一元關聯操作 (Unary Relational Operation) < 屬性列 >
◦ 在此處的目的就是限制住不該看到的屬性,只挑選出要看到的屬性,要注意的是
◦ 此處所出現的所有屬性,必須都要是關聯 R 中的屬性,不得超出關聯 R 之外的屬性
投影操作 ( Project Operation )
查詢所有員工的員工編號、姓名、職稱和地址 【說明】
◦ 此種範例主要是針對『屬性』做篩選,並非一個關聯的所有屬性皆要輸出,目的除了可以避免某些資料被未授權者所看到外,亦可篩選掉多餘而不需要的屬性項
【表示式】 π( 員工編號 , 姓名 , 職稱 , 地址 )( 員工 )
【範例 5-4 】
圖 5-9 【範例 5-4 】的結果
用意在暫時儲存某些操作後所產生的關聯,故稱為暫存關聯 可將一連串的操作分為數個獨立的操作分別進行 例如要查詢男性員工的員工編號、姓名、職稱、性別與地址,可以使
用兩次的操作,如下
男性員工 = σ( 性別 =‘ 男’ )( 員工 ) π( 員工編號、姓名、職稱、性別與地址 )( 男性員工 )
or
暫存員工 = π( 員工編號、姓名、職稱、性別與地址 )( 員工 ) σ( 性別 =‘ 男’ )( 暫存員工 )
暫存關聯
在關聯中,每一個屬性皆有其名稱,但在某些操作後,倘若想要將其屬性名稱做更改,就有必要使用更名操作 (Rename Operation)
例如要將關聯員工的屬性,員工編號、姓名、職稱和地址,在輸出時,更改為編號、員工姓名、職務和通訊地址,在關聯代數的表示式為
暫存員工 ( 編號 , 員工姓名 , 職務 , 通訊地址 )=π( 員工編號 , 姓名 , 職稱 ,
地址 )( 員工 )
更名操作 ( Rename Operation )
查詢所有男性員工的員工編號、姓名、職稱、性別和地址。 【說明】
◦ 在此範例中,不僅對橫向的屬性值做篩選,例如『男性員工』即是針對性別屬性中挑選出屬性值為『男』的值組;亦對縱向的屬性做一投影操作,例如員工編號、姓名、職稱、性別和地址。所以在挑選時,不但要使用選取操作 (SELECT operation) ,亦要同時使用投影操作 (PROJECT operation) 兩個操作,可做一組合的混合操作。至於該使用『先選取操作,後投影操作』或是『先投影操作,後選取操作』呢?在此範例中,兩者皆可,如下表示式所示
【範例 5-5 】
【表示式】先選取操作,後投影操作
))員工(( )''(},,,,( 男性別地址性別職稱姓名員工編號
圖 5-10 【範例 5-5 】的結果
【表示式】先投影操作,後選取操作
))員工(( },,,,()''( 地址性別職稱姓名員工編號男性別
圖 5-10 【範例 5-5 】的結果
查詢所有男性員工的員工編號、姓名、職稱和地址 【說明】
◦ 在此範例彷彿和【範例 5-5 】很相似,唯獨其中只有缺少一個『性別』屬性之差異
【表示式】
【範例 5-6 】
))員工(( )''(},,,( 男性別地址職稱姓名員工編號
圖 5-11 【範例 5-6 】的結果
不可交換的情形
缺少『性別』屬性
))員工(( },,,()''( 地址職稱姓名員工編號男性別
圖 5-12 先投影操作,後選取操作的問題
查詢所有男性業務和女性業務助理之員工編號、姓名、職稱和性別。
【說明】◦ 在此範例中,不僅對橫向的屬性值做篩選 ( 即為選取操
作 ) ,例如『男性員工』即是針對『選取操作』的橫向篩選,而輸出的員工編號、姓名、職稱和性別等屬性,則為縱向篩選 ( 即為投影操作 ) 。
【範例 5-7 】
【表示式】 先『投影操作』,後『選取操作』
或 先『選取操作』,後『投影操作』
))員工(( },,,())''AND''(OR)''AND''(( 性別職稱姓名員工編號業務助理 職稱 女性別 業務 職稱 男性別
))員工(( ))''AND''( OR)''AND''((},,,( 業務助理 職稱 女性別 業務 職稱 男性別性別職稱姓名員工編號
圖 5-13 【範例 5-7 】查詢的結果
5-1 簡介 5-2 一元關聯操作 5-3 二元關聯操作 5-4 集合論 (Set Theory) 操作 5-5 聚合函數 (Aggregate Functions) 計算 5-6 綜合查詢
本章內容
對兩個關聯進行的操作,稱之為二元操作 單一個關聯操作的過程中,主要都是針對關聯的屬
性與值組的篩選動作 二元操作的主要重點則是在於關聯與關聯之間的合併 (Join) 動作。
5-3 二元關聯操作 (Binary Relational Operation)
在關聯式代數中,是以 × 來表示卡式積 或稱為交叉乘積 (Cross Product) ,或交叉合併 (Cross Join) 屬於二元操作,也就是針對兩個關聯的操作 例如有兩個關聯,分別名為 R 與 S ,則表示為
R × S 兩個關聯分別有 m 與 n 個屬性,可表示成 R(A1,A2,…Am) 與
S(B1,B2,…Bn) ,而此兩者的卡式積若為關聯 Q ,亦可表示成Q = R(A1,A2,…Am) × S(B1,B2,…Bn)
其結果關聯 Q 的屬性數,必為 m+n 個,其內容如下Q(A1, A2,…, Am ,B1, B2,…, Bn)
左邊為關聯 R 的 m 個屬性 A1,A2,…, Am右邊為關聯 S 的 n 個屬性 B1,B2,…Bn
卡式積之後,全部皆成為關聯 Q 之屬性 A1,A2,…Am,B1,B2,…Bn 共有 m+n 個屬性數。倘若關連 R具有 p筆值組, S具有 q筆值組,
則關聯 Q 將會具有 p×q筆值組
『卡式積』 (Cartesian Product)
卡式積就是將兩個關聯合併,並且將所有的合併情形皆輸出
在兩個關聯之間,會存在於一個所謂的關聯性(Relationship) ,此關聯性是利用比較運算子來比較兩個關聯中的某一個或多個屬性之間的比較關係,這種合併在關聯代數中,稱之為 θ-Join( 唸成theta-join) 或 THETA JOIN
θ-Join 比較運算子包括 {=,<, ≦,>, ≧, ≠}
θ-Join
若是只針對單一個等號 {=} 的比較運算子,稱之為 EQUIJOIN
也就是 θ-Join 的一個子集合或是特例 EQUIJOIN 也是在關聯式代數中,最常被使用到的
一種合併 (Join) 關係,通常表示成 例如兩個關聯 R 與 S 的 EQUIJOIN
R ( 條件情形 )S
EQUIJOIN
θ-Join or EQUIJOIN 圖解
相同的屬性出現兩次
關聯 R
關聯 S
關聯 R 關聯 S
(a) THETA JOIN or EQUIJOIN 圖 5-14 THETA JOIN , EQUIJOIN 與 NATURE JOIN
使用 EQUIJOIN 的等號 {=} 比較運算子,則重複的屬性其屬性值兩邊一定皆會相等,則重複出現將失去其意義
依據 EQUIJOIN 之後,去除一邊重複的屬性,則稱之為 NATURE JOIN
以 * 來表示 NATURE JOIN ,倘若有關聯 R 與S ,則 R 與 S 的 NATURE JOIN 表示成
R * ( 條件情形 )S
NATURE JOIN
NATURE JOIN 圖解
相同屬性只出現一次
關聯 R
關聯 S
關聯 R 關聯 S
(b) NATURE JOIN 圖 5-14 THETA JOIN , EQUIJOIN 與 NATURE JOIN
倘若要查詢每一位員工所經手的訂單資料。 【說明】
◦ 在此查詢中,如果先以簡單將『員工』所有屬性和『訂單』的所有屬性輸出,則只要將此兩個關聯進行合併動作,而此處的關聯性來自於員工中的員工編號與訂單中的員工編號,也由於這兩個屬性名稱剛好相同,所以在表示式中,必須在屬性前加上關聯名稱,例如員工的員工編號將表示成員工 . 員工編號,訂單中的員工編號表示成訂單 . 員工編號
【表示式】員工 ( 員工 . 員工編號 = 訂單 . 員工編號 ) 訂單
【範例 5-8 】
此兩個屬性值相等
『員工』關聯的屬性 『訂單』關聯的屬性
(a)
【範例 5-8 】 EQUIJOIN JOIN 的結果
圖 5-15 EQUIJOIN JOIN & NATURE JOIN 的結果
『員工』關聯的屬性『訂單』關聯的屬性少一個員工編號屬性
(b)
【範例 5-8 】 NATURE JOIN 的結果
圖 5-15 EQUIJOIN JOIN & NATURE JOIN 的結果
查詢所有訂單中,哪些產品的實際單價並未以建議單價來銷售。
【說明】◦ 在此查詢中,有相關的關聯包括『訂單明細』與『產品資料』兩個
關聯,並且依據查詢的條件中,可清楚看出,在『訂單明細』與『產品資料』兩個關聯的相同產品編號做『相等』的比較運算,而訂單明細中的實際單價與產品資料中的建議單價做『不相等』的比較運算。
【表示式】訂單明細 θ ( 訂單明細 . 產品編號 = 產品資料 . 產品編號 AND
訂單明細 . 實際單價 <> 產品資料 . 建議單價 ) 產品資料
【範例 5-9 】
產品編號之屬性值相等
實際單價與建議單價之
屬性值不相等
『訂單明細』關聯之屬性
『產品資料』關聯之屬性
圖 5-16 THETA JOIN( 不相等的比較運算 ) 的結果
左邊外部合併 (Left Outer Join)◦ 以左邊的關聯為主,倘若無法對應到右邊的關聯,則左邊的資料亦會全部出現,僅在右邊關聯的所有屬性其值皆會以空值 (Null Value) 出現
右邊外部合併 (Right Outer Join)◦ 以右邊的關聯為主
完全外部合併 (Full Outer Join)◦ 以兩邊的關聯皆為主,可說是左邊外部關聯與右邊外部關聯的聯集,
也就是兩邊的所有資料皆要出現於合併後的關聯中,彼此無法對應上的部份,則另一邊關聯的所有屬性的屬性值皆會出現空值 (Null Value)
外部合併 (Outer Join)
在關聯式代數中,左邊外部合併的符號為,也就是合併左右兩邊關聯,所以也是屬於二元運算子,倘若有關聯 R 與 S ,則此兩關聯的左邊外部合併表示成
R ( 條件情形 )S 相對地,右邊外部關聯的表示符號為,完全外部關
聯的符號為,其分別表示成R ( 條件情形 )SR ( 條件情形 )S
查詢所有員工承接的訂單資料,即使沒有承接任何訂單也都要出現該員工的資料。
【說明】◦ 在此範例中,有相關的關聯包括『員工』與『訂單』兩個關聯,並
且依據查詢的條件中,可直接使用左邊外部合併 (Left Outer Join) 或右邊外部合併 (Right Outer Join) 來合併所需要的關聯,至於是使用左或右,必須視其表示式中,兩個關聯放置於合併符號的左右情形而訂。以此條件是以『員工』關聯為主,『訂單』關聯為輔,若是將員工放置於合併符號的左邊,訂單放置於右邊,則必須使用左邊外部合併;反之,若是將『員工』關聯放置於該符號右邊,訂單放置於符號的左邊,則必須改用右邊外部合併。
【範例 5-10 】
【表示式】左邊外部合併
員工 ( 員工 . 員工編號 = 訂單 . 員工編號 ) 訂單右邊外部合併
訂單 ( 員工 . 員工編號 = 訂單 . 員工編號 ) 員工
Null
員工 訂單
員工的員工編號屬性值與訂單的員工編號屬性值做『相等』比較
圖 5-17 『所有』員工承接的訂單情形
或稱之為『自我合併操作』 (Self-Join Operations)
屬於二元操作運算元 所使用的關聯卻只有一個
『遞迴封閉式操作』 (Recursive Close Operations)
(c) (d)
R R”R’
(a) (b)
圖 5-18 遞迴封閉式操作示意圖
查詢員工和所屬上司之所有資料。 【說明】
◦ 在此範例中,有相關的關聯只有『員工』一個關聯,其中的『報告人』自我參考到『員工編號』的屬性,如圖 5-18(c) ,但此關聯卻要扮演兩個不同的角色,一個就是員工,另一個就是上司角色,如圖 5-18(d) 的示意圖。
【範例 5-11 】
【表示式】 (Theta Join)
◦ 員工關聯 = π ( 員工編號 , 姓名 , 職稱 , 報告人 ) 員工◦ 上司關聯 = π ( 員工編號 , 姓名 , 職稱 ) 員工◦ 合併後關聯 = 員工關聯 ( 員工關聯 . 報告人 = 上司關聯 . 員工編號 ) 上司關聯
(Outer Join)◦ 員工關聯 = π ( 員工編號 , 姓名 , 職稱 , 報告人 ) 員工◦ 上司關聯 = π ( 員工編號 , 姓名 , 職稱 ) 員工◦ 合併後關聯 = 員工關聯 ( 員工關聯 . 報告人 = 上司關聯 . 員工編號 ) 上司關聯
(a) Theta Join 之結果
(b) Outer Join 之結果
圖 5-19 【範例 5-11 】之結果
5-1 簡介 5-2 一元關聯操作 5-3 二元關聯操作 5-4 集合論 (Set Theory) 操作 5-5 聚合函數 (Aggregate Functions) 計算 5-6 綜合查詢
本章內容
利用集合理論來對關聯進行不同的操作這些操作包括
◦ 交集操作( Intersection Operation)◦ 聯集操作( Union Operation)◦ 差集操作( Difference Operation)
5-4 集合論 (Set Theory) 操作
交集操作( Intersection Operation),表示成∩ 將兩個集合內,共同或相同的元素選取出來 以『集合論』的觀點而言,例如有兩個集合分別為 R 與
S ,則此兩個集合的交集將表示成 R∩S ,會去除掉兩個集合中的相同的重複元素,相同元素只會出現一次
交集操作( Intersection Operation )
R SR∩S
宇集 (Universal Set)
R∩S
S
R
(a) 以集合論的觀點 (b) 以關聯的觀點
圖 5-20 R∩S 交集的圖示
倘若要從『客戶』與『供應商』的兩個關聯中,挑選出既是客戶,同時又是供應商的公司相關資料,如公司名稱、聯絡人以及地址,做為公司行銷上的參考資料。
【說明】◦ 此查詢是要從『客戶』關聯中有的值組,同時在『供應商』關聯中
也有的共同值組挑選出來,也就是客戶中的『公司名稱』屬性和供應商中的『供應商』屬性,具有相同屬性值的值組
【表示式】
【範例 5-12 】
)()( ),,(),,( 供應商客戶 地址聯絡人供應商地址聯絡人公司名稱
圖 5-21 客戶與供應商的交集結果
聯集操作( Union Operation),表示成∪ 將兩個集合內的元素合併在一起 以集合論的觀點而言,在兩個集合中均出現的元素,在經
過聯集操作之後,只會留下一個元素,而不會有重複元素的情形
例如有兩個集合分別為 R 與 S ,則此兩個集合的聯集將表示成 R∪S ,會去除掉兩個集合中相同的重複元素,相同元素只會出現一次
聯集操作( Union Operation )
R S
← R∪S →
宇集 (Universal Set)
R∪S
R
S
(b) 以關聯的觀點(a) 以集合論的觀點
圖 5-22 R S∪ 聯集的圖示
倘若公司要寄出邀請函,同時邀請客戶與供應商,並挑選出公司名稱、聯絡人以及地址。
【說明】◦ 此例的查詢,是要將兩個關聯做聯集處理,也因此在聯集後,會自
動將重複資料去除,僅留下一筆,可避免同一家公司重複收到相同的邀請函
【表示式】
【範例 5-13 】
)()( ),,(),,( 供應商客戶 地址聯絡人供應商地址聯絡人公司名稱
圖 5-23 客戶與供應商的聯集結果
差集操作( Set Difference Operation),表示成 ﹣ 將兩個集合內,去除掉與另一個集合相同的元素,僅留
下另一個集合沒有的元素 以『集合論』的觀點而言,例如有兩個集合分別為 R 與
S ,則此兩個集合的差集將表示成◦ R-S
表示從集合 R 中,去除 R 與 S 共同的部份 ( 也就是 R∩S) ,所剩餘的部份就是 R-S
◦ S-R表示從集合 S 中,去除 R 與 S 共同的部份 ( 也就是 R∩S) ,所剩餘的部份就是 S-R
差集操作( Difference Operation )
R S
R∩SR-S S-R
宇集 (Universal Set)
R∩S
R-S
S-R
S
R
圖 2-24 R-S 和 S-R 差集的圖示
(a) 以集合論的觀點 (b) 以關聯的觀點
倘若要從客戶與供應商的兩個關聯中,挑選出◦ (a) 單純為客戶,不是供應商以及◦ (b) 單純為供應商,不是客戶者
【說明】◦ (a) 從客戶的關聯中,去除既為客戶又為供應商的資料◦ (b) 從供應商的關聯中,去除既為供應商又為客戶的資料
【表示式】◦ (a)
◦ (b)
【範例 5-14 】
)()( ),,(),,( 供應商客戶 地址聯絡人供應商地址聯絡人公司名稱
)()( ),,(),,( 客戶供應商 地址聯絡人公司名稱地址聯絡人供應商
(a) 客戶 – 供應商
(b) 供應商 – 客戶
圖 2-25 客戶與供應商的差集結果
5-1 簡介 5-2 一元關聯操作 5-3 二元關聯操作 5-4 集合論 (Set Theory) 操作 5-5 聚合函數 (Aggregate Functions) 計算 5-6 綜合查詢
本章內容
針對關聯中某些屬性進行群組之後的計算,包括◦ 計算加總的 Sum() 函數◦ 計算平均的 Average() 函數◦ 計算筆數的 Count() 函數◦ 最大值的 Max() 函數◦ 最小值的 Min() 函數
若是有個關聯名為 R ,則聚合運算的表示為< 群組屬性 > < 聚合函數表列 >(R)
◦ <群組屬性 >關聯 R 中的屬性表列,用以分群組的一個依據
◦ < 聚合函數表列 >表示此處要使用哪一種聚合函數
5-5 聚合函數 (Aggregate Functions)計算
依據每一筆訂單編號,計算出每一張訂單中所訂購產品的總金額。
【說明】◦ 此例的查詢,可以使用單一個『訂單明細』之關聯,先將
其中的屬性實際單價和數量進行相乘積之計算後,再依據sum() 聚合函數的加總計算,如下所表示sum( 實際單價× 數量 )
【表示式】< 訂單編號 > sum( 實際單價 × 數量 )( 訂單明細 )
【範例 5-15 】
總金額= (18×10+25×20+35×15)= 1205
總金額= (20×9+15×6)= 270
圖 5-26 【範例 5-15 】之結果
5-1 簡介 5-2 一元關聯操作 5-3 二元關聯操作 5-4 集合論 (Set Theory) 操作 5-5 聚合函數 (Aggregate Functions) 計算 5-6 綜合查詢
本章內容
查詢供應商中,聯絡人為女董事長之供應商編號、供應商、聯絡人以及聯絡人職稱。
【說明】◦ 從需求中的四個輸出屬性,供應商編號、供應商、聯絡人和聯絡人
職稱,而這四個屬性皆可直接從供應商關聯中取得,所以可知本查詢僅需要使用單一個『供應商』關聯即可達到查詢的需求。
◦ 在此查詢中必須要注意的是使用到投影 (PROJECT) 和選取(SELECT) 兩種操作,原則上此兩種操作是具有交換性,但此查詢少一個『聯絡人性別』屬性,卻也因為在投影操作的部份沒有『聯絡人性別』屬性,導致僅能先使用『選取操作』,再使用『投影操作』,兩者操作順序不可互換
【範例 5-16 】
( 表示式一 ) ◦ 選取操作後關聯 = σ 性別 =’ 女’ and 聯絡人職務 =’ 董事長’ ( 供應商 )
◦ 投影操作後關聯 = π 供應商編號 , 供應商 , 聯絡人 , 聯絡人職稱 ( 選取操作後關聯 )
( 表示式二 ) ◦ π 供應商編號 , 供應商 , 聯絡人 , 聯絡人職稱 (σ 性別 =’ 女’ and 聯絡人職務 =’ 董事長’ ( 供應
商 ))
• 圖 5-27 【範例 5-16 】之結果
查詢員工編號小於 8300000女性員工之員工編號、姓名、職稱、性別和任用日期
【說明】◦ 從此需求的輸出屬性可以很清楚瞭解到都是屬於員工關聯
中的屬性,所以是屬於單一關聯的操作即可◦由於要查詢員工編號小於 8300000 且是女性員工屬於選
取操作,而投影操作中又有員工編號和性別之屬性,所以此查詢不論是先選取操作或投影操作皆可
【範例 5-17 】
【表示式】 ( 表示式一 )
◦ 選取操作後關聯 = σ 員工編號 < 8300000 and 性別 =’ 女’ ( 員工 )
◦ 投影操作後關聯 = π 員工編號 , 姓名 , 職稱 , 性別 , 任用日期 ( 選取操作後關聯 )
( 表示式二 ) ◦ π 員工編號 , 姓名 , 職稱 , 性別 , 任用日期 (σ 員工編號 < 8300000 and 性別 =’ 女’ ( 員工 ))
( 表示式三 ) ◦ σ 員工編號 < 8300000 and 性別 =’ 女’ (π 員工編號 , 姓名 , 職稱 , 性別 , 任用日期 ( 員工 ))
圖 5-28 【範例 5-17 】之結果
查詢既是客戶又是供應商身份,並且其對應的聯絡人身份為董事長之公司名稱、聯絡人和電話。
【說明】◦ 從圖 5-29 中可以清楚看出客戶和供應商並不具有直接的
關聯性,而且其輸出的屬性在兩個關聯之中皆有其同義之屬性,所以在客戶和供應商的兩個關聯中的資料可以使用『交集操作』。
【範例 5-18 】
圖 5-29 【範例 5-18 】之關聯圖
【表示式】◦ ( 表示式一 )
投影操作後客戶關聯 = π 公司名稱 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 客戶 ) )投影操作後供應商關聯 = π 供應商 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 供應商 ) )交集操作後關聯 = 投影操作後客戶關聯∩投影操作後供應商關聯
◦ ( 表示式二 ) π 公司名稱 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 客戶 ) ) ∩ π 供應商 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 供應商 ) )
圖 5-30 【範例 5-18 】之結果
查詢客戶與供應商的聯絡人之職稱為『董事長』的所有資料,輸出為公司名稱、聯絡人和電話等屬性。
【說明】◦ 此查詢與【查詢 5-18 】相似,只是查詢 5-18 是求兩者
皆有的資料,也就是取交集,而此查詢則是要將兩個關聯的資料合併在一起,也就是『聯集操作』。
【範例 5-19 】
【表示式】◦ ( 表示式一 )
投影操作後客戶關聯 =π 公司名稱 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 客戶 ) )投影操作後供應商關聯 =π 供應商 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 供應商 ) )聯集操作後關聯 = 投影操作後客戶關聯∪投影操作後供應商關聯
◦ ( 表示式二 ) π 公司名稱 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 客戶 ) )∪π 供應商 , 聯絡人 , 電話 ( σ 聯絡人職稱 =’ 董事長’ ( 供應商 ) )
圖 5-31 【範例 5-19 】之結果
查詢有提供產品名稱為『咖啡』的供應商,包括產品編號、產品名稱、供應商編號和供應商等屬性。
【說明】◦ 從此查詢的輸出需求為產品編號、產品名稱、供應商編號
和供應商等屬性,必須從產品資料與供應商兩個關聯方能找出此查詢的相關資料,如圖 5-32虛線內表示出供應商與產品資料之間的關聯性,所以將此兩個關聯做合併處理後,再進行選取操作和投影操作。以此需求,當然也可以先進行選取操作和投影操作後,再進行合併處理的。
【範例 5-20 】
圖 5-32 【範例 5-20 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 產品資料 ( 產品資料 . 供應商編號 = 供應商 . 供應商編號 ) 供應商選取操作後關聯 = σ 產品資料 . 產品名稱 =’ 咖啡’ ( 合併後關聯 )投影操作後關聯 = π 產品資料 . 產品編號 , 產品資料 . 產品名稱 , 供應商 . 供應商編號 , 供應
商 . 供應商 ( 選取操作後關聯 )◦ ( 表示式二 )
π 產品資料 . 產品編號 , 產品資料 . 產品名稱 , 供應商 . 供應商編號 , 供應商 . 供應商 (σ 產品資料 . 產品
名稱 =’ 咖啡’ ( 產品資料 ( 產品資料 . 供應商編號 = 供應商 . 供應商編號 ) 供應商 ))
圖 5-33 【範例 5-20 】之結果
查詢每張訂單的明細資料,包括訂單編號、訂貨日期、產品編號、產品名稱、客戶編號和客戶之公司名稱。
【說明】◦ 此查詢雖然輸出的屬性並不多,僅有訂單編號、訂貨日期、產品編號、產
品名稱、客戶編號和客戶之公司名稱,但這些的屬性分佈在客戶、訂單、訂單明細和產品資料等四個關聯之中,如圖 5-34虛線內的關聯:所以此查詢必須針對此四個關聯進行合併後,再利用投影操作。在此處要特別注意到,是否可先進行投影操作後再進行合併呢?若是先進行投影操作後,有些屬性將會消失,導致在進行合併時會出問題,所以必須先進行合併操作後再進行投影操作。
◦ 在合併時,我們必須要注意到的事,由於有四個關聯,而關聯之間皆有一個關聯性 (Relationship) ,所以總共會有 4 – 1 = 3 個關聯性的產生,也就是要進行三次的合併動作。
【範例 5-21 】
圖 5-34 【範例 5-21 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 產品資料 產品資料 . 產品編號 = 訂單明細 . 產品編號 ( 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 訂單 訂單 . 客戶編號 = 客戶 . 客戶編號客戶 ) )
投影操作後關聯 = π 訂單 . 訂單編號 , 訂單 . 訂貨日期 , 訂單明細 . 產品編號 , 產品資料 .
產品名稱 , 訂單明細 . 客戶編號 , 客戶 . 公司名稱 ( 合併後關聯 )
◦ ( 表示式二 ) π 訂單 . 訂單編號 , 訂單 . 訂貨日期 , 訂單明細 . 產品編號 , 產品資料 . 產品名稱 , 訂單明細 . 客戶編號 ,
客戶 . 公司名稱 ( 產品資料 產品資料 . 產品編號 = 訂單明細 . 產品編號 ( 訂單明細 訂
單明細 . 訂單編號 = 訂單 . 訂單編號 ( 訂單 訂單 . 客戶編號 = 客戶 . 客戶編號客戶 ) ))
圖 5-35 【範例 5-21 】之結果
查詢每張訂單的相關資料,包括訂單編號、訂貨日期和產品名稱等屬性。
【說明】◦ 本查詢的輸出屬性僅有訂單編號、訂貨日期和產品名稱等三個屬性,雖然訂單編號與訂貨日期可於『訂單』關聯中找到,而產品名稱可於『產品資料』中找到,但依據圖 5-36虛線內的關聯圖中,因為訂單與訂單明細具有一關聯性,而訂單明細與產品資料也有一關聯性,但訂單與產品資料之間卻沒有直接的關聯性,所以此查詢雖然沒有屬性是歸屬於訂單明細內,但依據合併原理,仍然要使用到三個關聯,訂單、訂單明細與產品資料。
【範例 5-22 】
圖 5-36 【範例 5-22 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 產品資料 產品資料 . 產品編號 = 訂單明細 . 產品編號 ( 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 訂單 )
投影操作後關聯 = π 訂單 . 訂單編號 , 訂單 . 訂貨日期 , 產品資料 . 產品名稱 ( 合併後關聯 )
◦ ( 表示式二 ) π 訂單 . 訂單編號 , 訂單 . 訂貨日期 , 產品資料 . 產品名稱 ( 產品資料 產品資料 . 產品編號 =
訂單明細 . 產品編號 ( 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 訂單 ) )
圖 5-37 【範例 5-22 】之結果
查詢每位員工的上司資料,且該上司的職稱為業務經理之資料,包括員工編號、員工的姓名、報告人的員工編號、報告人的姓名。
【說明】◦ 本查詢由於每位員工的上司也就是報告人,而報告人與員工都歸屬
於同一個關聯之中,所以此種查詢也稱之為遞迴封閉式操作(Recursive Closure Operations) 或是自我合併 (Self Join) 。
◦ 遞迴封閉式操作的處理方式是將同一個關聯扮演成兩個不同的角色,一個扮演成員工本身,一個扮演成上司,再進行兩個關聯的合併處理。但是此查詢條件中,還特別限制其上司的職稱為業務經理,所以在表示式中,上司必須要具有職稱的屬性。
【範例 5-23 】
【表示式】員工 = π 員工編號 , 姓名 , 報告人 ( 員工 )
上司 = π 員工編號 , 姓名 , 職稱 , 報告人 ( 員工 )
遞迴封閉式操作後關聯 = 員工 員工 . 報告人 = 上司 . 員工編號 AND 職稱 =’ 業務經
理’上司投影操作後關聯 = π 員工 . 員工編號 , 員工 . 姓名 , 上司 . 員工編號 , 上司 . 姓名 (遞迴封閉式操作後關聯 )
圖 5-38 【範例 5-23 】之結果
查詢出所有訂單中,實際單價小於產品的建議單價之資料,包括訂單編號、產品名稱,實際單價、建議單價和所負責的員工姓名等屬性。
【說明】◦ 在此查詢中所輸出的屬性,分別屬於員工、訂單、訂單明細和產品
資料四個關聯,如圖 5-39虛線內所示,除了一般的合併之關聯性之外,在此值得特別注意的是『實際單價小於產品的建議單價』,此條件也等於限制了訂單明細與產品資料之間的關聯性除了兩個關聯間的產品編號要相等之外,還要多一個訂單明細中的『實際單價』要小於產品資料中的『建議單價』。
【範例 5-24 】
圖 5-39 【範例 5-24 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 產品資料 產品資料 . 產品編號 = 訂單明細 . 產品編號 ( 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 訂單 訂單 . 員工編號 = 員工 . 員工編號員工 ))
選取後關聯 = σ 訂單明細 . 實際單價 < 產品資料 . 建議單價 ( 合併後關聯 )
投影後關聯 = π 訂單 . 訂單編號 , 產品資料 . 產品名稱 , 訂單明細 . 實際單價 , 產品資料 . 建議
單價 , 員工 . 姓名 ( 選取後關聯 )
◦ ( 表示式二 )π 訂單 . 訂單編號 , 產品資料 . 產品名稱 , 訂單明細 . 實際單價 , 產品資料 . 建議單價 , 員工 . 姓名 (σ
訂單明細 . 實際單價 < 產品資料 . 建議單價 ( 產品 資料產品資料 . 產品編號 = 訂單明細 . 產品編號
( 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 訂單 訂單 . 員工編號 = 員工 . 員工
編號員工 ))))
圖 5-40 【範例 5-24 】之結果
查詢出哪些產品的『庫存量』小於『安全存量』的相關資料,包括產品編號、產品名稱、供應商編號和供應商等屬性。
【說明】◦ 由於庫存量與安全存量皆屬於產品資料,所以只要直接做比較即可,
但輸出的屬性還包括供應商編號和供應商,所以必須再與供應商關聯做合併處理。
◦ 在操作的順序上,如果先使用合併後的關聯,再使用選取操作和投影操作是最安全且沒問題的順序,倘若是先使用投影操作,如同前述,必須要注意到是否有後續操作要使用到的屬性在投影操作過程中消失了。
【範例 5-25 】
圖 5-41 【範例 5-25 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 產品資料 產品資料 . 供應商編號 = 供應商 . 供應商編號供應商選取操作後關聯 = σ 產品資料 . 庫存量 < 產品資料 . 安全存量 ( 合併後關聯 )
投影操作後關聯 =π 產品資料 . 產品編號 , 產品資料 . 產品名稱 , 產品資料 . 供應商編號 , 供
應商 . 供應商 ( 選取操作後關聯 )
◦ ( 表示式二 )π 產品資料 . 產品編號 , 產品資料 . 產品名稱 , 產品資料 . 供應商編號 , 供應商 . 供應商 (σ 庫存量 < 安
全存量 ( 產品資料 產品資料 . 供應商編號 = 供應商 . 供應商編號供應商 ))
圖 5-42 【範例 5-25 】之結果
計算每一筆訂單的總金額,包括訂單編號、訂貨日期和總金額等屬性。
【說明】◦ 此範例是屬於聚合函數計算之模式,由於是計算『每一筆』訂單的總金額,所以是以訂單的訂單編號為分群之依據,但是因為輸入屬性還包括訂貨日期,系統並不會知道同一個訂單編號是否只會有一個訂貨日期,所以應該要以訂單編號和訂貨日期兩者同時為群組屬性,故此範例不同於【範例 5-26 】只要以一個訂單編號為群組即可;在計算總金額之前,必須先將每一個產品的小計計算出,如小計 = 實際單價× 數量,再將同一張訂單的所有小計加總,成為sum( 實際單價× 數量 ) 。
【範例 5-26 】
圖 5-43 【範例 5-26 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 訂單 訂單 . 訂單編號 = 訂單明細 . 訂單編號訂單明細分群加總後關聯 = 訂單 . 訂單編號 , 訂單 . 訂貨日期 sum( 訂單明細 . 實
際單價 × 訂單明細 . 數量 )( 合併後關聯 )◦ ( 表示式二 )
訂單 . 訂單編號 , 訂單 . 訂貨日期 sum( 訂單明細 . 實際單價 × 訂單明細 . 數量 )
( 訂單 訂單 . 訂單編號 = 訂單明細 . 訂單編號訂單明細 )
圖 5-44 【範例 5-26 】之結果
計算每一位員工所承接的每一張訂單總金額,包括員工編號、員工的姓名、訂單編號、總金額等屬性
【說明】◦ 本範例與前一查詢有些差異,因為此查詢又多了一個員工資料,並
且先以每一位員工做群組,再依每一張訂單做群組。簡言之,就是以員工編號、員工之姓名和訂單編號三個屬性分群計算,並使用到員工、訂單及訂單明細三個關聯
◦ 但仔細看輸出的屬性還包括員工的姓名,所以必須要將此屬性也加入群組之中,否則將會出現錯誤。
【範例 5-27 】
圖 5-45 【範例 5-27 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 員工 員工 .
員工編號 = 訂單 . 員工編號訂單 )
分群加總後關聯 = ( 員工 . 員工編號 , 員工 . 姓名 , 訂單 . 訂單編號 )
sum( 訂單明細 . 實際單價 × 訂單明細 . 數量 )( 合併後關聯 )
◦ ( 表示式二 )
( 員工 . 員工編號 , 員工 . 姓名 , 訂單 . 訂單編號 ) sum( 訂單明細 . 實際單價 × 訂單明細 .
數量 )( 訂單明細訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 員工 員工 . 員工編號 = 訂單 . 員
工編號訂單 ))
圖 5-46 【範例 5-27 】之結果
計算每位員工所承接訂單中,不同產品的總數量,包括員工編號、員工的姓名、產品編號以及總數量等屬性
【說明】◦ 此查詢與【查詢 5-27 】所使用到的關聯相同,參考圖 5-
45 之關聯圖,而此查詢所要計算的總數量是以員工和產品為主要分群,但以輸出的屬性而言,可以很清楚瞭解到群組屬性為員工編號、員工的姓名和產品編號;聚合函數的計算是使用 sum( 數量 ) 。
【範例 5-28 】
【表示式】◦ ( 表示式一 )
合併後關聯 = 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 員工員工 . 員工編號
= 訂單 . 員工編號訂單 )
分群加總後關聯 = ( 員工 . 員工編號 , 員工 . 姓名 , 訂單明細 . 產品編號 ) sum( 訂
單明細 . 數量 )( 合併後關聯 )
◦ ( 表示式二 )
( 員工 . 員工編號 , 員工 . 姓名 , 訂單明細 . 產品編號 ) sum( 訂單明細 . 數量 ) ( 訂單明細訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 員工 員工 . 員工編號 = 訂單 . 員工編號訂單 ))
圖 5-47 【範例 5-28 】之結果
計算出每一種產品類別被訂購的總數量,包括類別編號、類別名稱、總數量等屬性。
【說明】◦ 此範例的主要目標是產品類別的計算,但輸出資料還有類
別名稱,所以應該以類別編號和類別名稱為分群組之依據;但是所計算的總數量是依據訂單明細中的數量之加總,所以本查詢必須使用產品類別、產品資料和訂單明細三個關聯進行合併處理之後,再以類別編號、類別名稱為群組屬性。
【範例 5-29 】
圖 5-48 【範例 5-29 】之關聯圖
【表示式】◦ ( 表示式一 )
合併後關聯 = 訂單明細 訂單明細 . 產品編號 = 產品資料 . 產品編號( 產品資料 產品資料 . 類別編號 = 產品類別 . 類別編號產品類別 )聚合函數計算 = 產品類別 . 類別編號 , 產品類別 . 類別名稱 sum( 訂單明
細 . 數量 )( 合併後關聯 )◦ ( 表示式二 )
產品類別 . 類別編號 , 產品類別 . 類別名稱 sum( 訂單明細 . 數量 ) ( 訂單明細 訂單明細 . 產品編號 = 產品資料 . 產品編號 ( 產品資料 產品資料 . 類別編號
= 產品類別 . 類別編號產品類別 ))
圖 5-49 【範例 5-29 】之結果
計算出產品類別編號小於 5 的所有產品,訂購的總數量,包括產品類別、類別名稱,總數量。
【說明】◦ 此範例與【範例 5-29 】幾乎是相同的處理分式,可參考
圖 5-48 之關聯圖,只是在聚合函數計算之前,必須先經過選取操作,選取出符合產品類別編號小於 5 的產品,並過濾掉不符合條件的資料之後,再進行聚合函數的sum( 數量 ) 計算。
【範例 5-30 】
【表示式】◦ ( 表示式一 )
合併後關聯 = 訂單明細 訂單明細 . 產品編號 = 產品資料 . 產品編號 ( 產品資料 產品資料 . 類別編號 = 產品類別 . 類別編號產品類別 )
選取操作後關聯 = σ 產品類別 . 類別編號 < 5 ( 合併後關聯 )
聚合函數計算 = 產品類別 . 類別編號 , 產品類別 . 類別名稱 sum( 訂單明細 . 數量 )( 選取操作後關聯 )
◦ ( 表示式二 )
產品類別 . 類別編號 , 產品類別 . 類別名稱 sum( 訂單明細 . 數量 )( σ 產品類別 . 類別編號 < 5 ( 訂單明細 訂單明細 . 產品編號 = 產品資料 . 產品編號 ( 產品資料 產品資料 . 類別編號
= 產品類別 . 類別編號產品類別 )))
圖 5-50 【範例 5-30 】之結果
計算出每位業務所承接訂單的總金額,包括員工編號、姓名、總金額。
【說明】◦ 本範例的主要計算是依據職務為『業務』之員工,並且輸
出又包括員工之姓名,所以在分群的屬性必須包括員工編號和姓名兩個,再將所有承接訂單的總金額進行聚合函數sum( 實際單價× 數量 ) 的計算。
◦ 在關聯的部份可參考圖 5-45 之關聯圖,也就是本查詢所使用的關聯包括員工、訂單和訂單明細三個。
【範例 5-31 】
【表示式】◦ ( 表示式一 )
合併後關聯 = 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 員工 員工 .
員工編號 = 訂單 . 員工編號訂單 )
選取操作後關聯 = σ 員工 . 職稱 =’ 業務’ ( 合併後關聯 )
分群加總後關聯 = ( 員工 . 員工編號 , 員工 . 姓名 , 訂單 . 訂單編號 ) sum( 訂
單明細 . 實際單價 × 訂單明細 . 數量 ) ( 選取操作後關聯 )
◦ ( 表示式二 )
( 員工 . 員工編號 , 員工 . 姓名 , 訂單 . 訂單編號 ) sum( 訂單明細 . 實際單價 × 訂單明細 .
數量 ) ( σ 員工 . 職稱 =’ 業務’ ( 訂單明細 訂單明細 . 訂單編號 = 訂單 . 訂單編號 ( 員工 員工 . 員工編號 = 訂單 . 員工編號訂單 ) ) )
圖 5-51 【範例 5-31 】之結果