PostgreSQL 原始碼解讀(16)- 查詢語句#1(基礎:關係代數)
本文簡單介紹了資料庫系統實現中的數學基礎-關係代數,包括關係代數的基本概念以及關係代數的運算如集合運算/投影/選擇/連線等.
一、基本概念
關係代數是一種過程化查詢語言.它包括一個運算的集合,這些運算以一個或兩個關係為輸入,產生一個新的關係作為結果.關係代數是SQL查詢語言的數學基礎.
關係代數的運算物件"關係"是一張二維表,由行和列組成,通俗地說,一個關係對應一張表.
下面是本文所使用的關係:
單位資訊T_DWXX
DWMC | DWBH | DWDZ |
---|---|---|
X有限公司 | 1001 | 廣東省廣州市荔灣區 |
Y有限公司 | 1002 | 北京市海淀區 |
Z有限公司 | 1003 | 廣西南寧市五象區 |
個人資訊T_GRXX
DWBH | GRBH | NL |
---|---|---|
1001 | 901 | 23 |
1002 | 902 | 33 |
1002 | 903 | 43 |
二、基本運算
關係代數的基本運算有:
名稱 | 符號 | 讀音 |
---|---|---|
選擇(select) | σ | sigma |
投影(project) | π | pi |
並(union) | ∪ | |
差(set-difference) | - | |
笛卡爾積(cartesian-product) | × | |
重新命名(rename) | ρ | rou |
選擇σ
定義:σφ(R)
選擇關係R中能夠滿足給定謂詞φ的元組(Tuple),將那些不滿足謂詞的元組剔除,組成一個新的關係.
如:
σDWBH='1001'(T_DWXX),選擇單位資訊中,單位編號DWBH=1001的單位資訊
σNL>40(T_GRXX),選擇個人資訊中,年齡NL>40的個人資訊
投影Π
定義:πa1,...,an(R)
使用投影關係來過濾出我們想要的屬性,投影關係返回一個僅含有這些屬性的關係.要注意的是,由於返回的是集合,所以會過濾重複的屬性值.
如:
πDWMC(T_DWXX),返回單位資訊中的單位名稱列
並∪
定義:πa1,...,an(R)∪πa1,...,an(S)
把兩個關係中的內容合併起來,或者一個關係經過不同的查詢,把結果合併在一起。並運算處理的兩個關係須具有相同的屬性。
如:
πDWBH(T_DWXX)∪πDWBH(T_GRXX)
差-
定義:πa1,...,an(R) - πa1,...,an(S)
關係R差運算關係S,剩下R中有但S中沒有的元組組成的關係.必須保證-運算在相容的關係之間進行.
如:
πDWBH(T_DWXX) - πDWBH(T_GRXX)
笛卡爾積×
定義:R × S
關係的屬性卻各不相同,對於這種情況不能使用交併差運算,但又希望把兩個不相關的關係連線起來,可以透過笛卡兒乘積,用第一個關係R中每一個元組和第二個關係S中的所有元組結合,形成一個新的關係.
如:
T_DWXX × T_GRXX,得到T_DWXX和T_GRXX的笛卡爾積,共9行資料
重新命名ρ
定義:ρnewname(R)
希望改變結果的名稱,可以透過ρ重新命名,為一個關係起個新的名稱.
如:
ρDW1001σDWBH='1001'(T_DWXX),把DWBH='1001'的單位資訊重新命名為DW1001
三、其他運算
其他常用運算包括:
名稱 | 符號 | 讀音 |
---|---|---|
交 | ∩ | |
賦值 | ← | |
自然連線 | ⋈ | |
θ連線 | ⋈ | thet |
半連線 | ⋉/⋊ | |
外連線 | ⟕/⟖/⟗ | |
聚集運算 | G |
交∩
定義:R ∩ S
在R和S兩個關係中都存在的元組的新關係。要求R和S兩個關係中的元組屬性相同。
如:
πDWBH(T_DWXX) ∩ πDWBH(T_GRXX)
賦值←
定義:R←S
使用箭頭左側的名字作為右邊關係的表示.
如:
DW←πDWBH(T_DWXX)
自然連線⋈
定義:R ⋈ S
自然連線將兩個表中共同屬性值都相同的元組拼接在一起作為一個新的元組,而將剩下不能拼接的部分全部捨棄,得到一個新的關係。
如:
T_DWXX ⋈ T_GRXX
θ連線
定義:R ⋈θ S
組合來自兩個關係R和S的元組,而組合條件不是簡單的共同屬性上的相等,需要一種一般形式的連線運算元,這就是θ連線.與自然連線不同的是,相同的屬性只會出現一次
如:
T_DWXX ⋈DWBH > GRBH T_GRXX,單位編號DWBH大於個人編號GRBH的單位資訊和個人資訊的元組組合
半連線⋉/⋊
定義: R ⋉ S / R ⋊ S
與S/R在共同屬性上有相等值的所有R/S中的元組
如:
T_DWXX ⋉ T_GRXX,與個人資訊中DWBH一樣的單位資訊
外連線⟕/⟖/⟗
定義: R ⟕ S / R ⟖ S / R ⟗ S
左外連線的結果包含R中所有元組,對每個元組,若在S中在統統屬性上值相等的元組,則正常連線,否則保留R中的此元組,並將S中對應的其他列設為NULL.右外連線/全外連線類似.
如:
T_DWXX ⟕ T_GRXX,所有的單位資訊,在個人資訊不存在的單位,個人資訊列值設定為NULL
聚集運算G
定義:Exp1,Exp2...Gfunc1,func2,...(R)
最大值/最小值/平均值/彙總/計數等.其中表示式Exp1...可選,G=MAX/MIN等
如:
DWMCGmax(DWBH)(T_DWXX),單位編號最大的單位名稱
四、關係代數與SQL
SQL語句的運算表示式可以使用關係代數運算表示:
例一
-- SQL
SELECT c1,c2,...
FROM r1,r2,...
WHERE P
-- 關係代數
πc1,c2,...(σP(r1 × r2 × ...))
例二
-- SQL
SELECT c1,c2,...,max(c1)
FROM r1,r2,...
WHERE P
GROUP BY c1,c2,...
-- 關係代數
c1,c2,...Gmax(c1)(πc1,c2,...(σP(r1 × r2 × ...)))
五、小結
1、概念:粗略介紹了關係代數的相關基本概念;
2、運算:大體介紹了基本運算以及連線等其他運算;
3、SQL:查詢語句的表示、重寫最佳化等均需要使用關係代數的相關知識。
六、參考
維基百科
《資料庫系統概念》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2374900/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)SQL原始碼優化
- PostgreSQL 原始碼解讀(31)- 查詢語句#16(查詢優化-表示式預處理#1)SQL原始碼優化
- PostgreSQL 原始碼解讀(90)- 查詢語句#75(ExecHashJoin函式#1)SQL原始碼函式
- PostgreSQL 原始碼解讀(88)- 查詢語句#73(SeqNext函式#1)SQL原始碼函式
- PostgreSQL 原始碼解讀(50)- 查詢語句#35(Optimizer Review#1)SQL原始碼View
- PostgreSQL 原始碼解讀(24)- 查詢語句#9(查詢重寫)SQL原始碼
- PostgreSQL 原始碼解讀(20)- 查詢語句#5(查詢樹Query詳解)SQL原始碼
- PostgreSQL 原始碼解讀(18)- 查詢語句#3(SQL Parse)SQL原始碼
- PostgreSQL 原始碼解讀(19)- 查詢語句#4(ParseTree詳解)SQL原始碼
- PostgreSQL 原始碼解讀(25)- 查詢語句#10(查詢優化概覽)SQL原始碼優化
- PostgreSQL 原始碼解讀(38)- 查詢語句#23(query_planner函式#1)SQL原始碼函式
- PostgreSQL 原始碼解讀(66)- 查詢語句#51(make_one_rel函式#16-...SQL原始碼函式
- PostgreSQL 原始碼解讀(83)- 查詢語句#68(PortalStart函式)SQL原始碼函式
- PostgreSQL 原始碼解讀(75)- 查詢語句#60(Review - standard_...SQL原始碼View
- PostgreSQL 原始碼解讀(74)- 查詢語句#59(Review - subquery_...SQL原始碼View
- PostgreSQL 原始碼解讀(42)- 查詢語句#27(等價類)SQL原始碼
- PostgreSQL 原始碼解讀(26)- 查詢語句#11(查詢優化-上拉子連結#1)SQL原始碼優化
- PostgreSQL 原始碼解讀(29)- 查詢語句#14(查詢優化-上拉子查詢)SQL原始碼優化
- PostgreSQL 原始碼解讀(37)- 查詢語句#22(查詢優化-grouping_plan...SQL原始碼優化
- PostgreSQL 原始碼解讀(52)- 查詢語句#37(make_one_rel函式#2-估算關係大小)SQL原始碼函式
- PostgreSQL 原始碼解讀(82)- 查詢語句#67(PortalXXX系列函式)SQL原始碼函式
- PostgreSQL 原始碼解讀(81)- 查詢語句#66(Review - exec_simp...SQL原始碼View
- PostgreSQL 原始碼解讀(89)- 查詢語句#74(SeqNext函式#2)SQL原始碼函式
- PostgreSQL 原始碼解讀(91)- 查詢語句#76(ExecHashJoin函式#2)SQL原始碼函式
- PostgreSQL 原始碼解讀(87)- 查詢語句#72(PortalRunSelect->E...SQL原始碼
- PostgreSQL 原始碼解讀(84)- 查詢語句#69(PortalStart->InitP...SQL原始碼
- PostgreSQL 原始碼解讀(85)- 查詢語句#70(PortalRun->InitPla...SQL原始碼
- PostgreSQL 原始碼解讀(86)- 查詢語句#71(PortalRun->PortalR...SQL原始碼
- PostgreSQL 原始碼解讀(93)- 查詢語句#77(ExecHashJoin函式#3)SQL原始碼函式
- PostgreSQL 原始碼解讀(51)- 查詢語句#36(Optimizer Review#2)SQL原始碼View
- PostgreSQL 原始碼解讀(166)- 查詢#86(基礎知識-上下文無關語法)SQL原始碼
- PostgreSQL 原始碼解讀(36)- 查詢語句#21(查詢優化-消除外連線)SQL原始碼優化
- PostgreSQL 原始碼解讀(21)- 查詢語句#6(PlannedStmt詳解-跟蹤分析)SQL原始碼
- PostgreSQL 原始碼解讀(73)- 查詢語句#58(grouping_planner函式...SQL原始碼函式
- PostgreSQL 原始碼解讀(23)- 查詢語句#8(PlannedStmt與QUERY P...SQL原始碼
- PostgreSQL 原始碼解讀(77)- 查詢語句#62(create_plan函式#1-主實...SQL原始碼函式
- PostgreSQL 原始碼解讀(44)- 查詢語句#29(等價類相關資料結構)SQL原始碼資料結構
- PostgreSQL 原始碼解讀(95)- 查詢語句#78(ExecHashJoin函式#4-H...SQL原始碼函式