關聯式代數(Relational Algebra)是什麼?
關聯式資料庫系統具有查詢語言可以用來操作資料庫,以數學來表示的查詢語言有兩大類關聯式代數(Relational Algebra)與關聯式計算(Relational Calculus)。這兩種都可以用來「描述」真正的查詢語言(SQL)。
關聯式代數(Relational Algebra)範例 : πname(σdep_no>2(Student))
關聯式計算(Relational Calculus)範例 : { t.name | Student(t) ∧t.dep_no>2 }
這兩種表示法,各有優缺點,但是以關聯式代數表示法,會比較接近SQL。
(1) 限制(Restrict),代表符號:σ
是指從資料表中,只抓取符合條件的資料。例如 : 從學生資料表抓取系編號大於2的資料。
σdep_no>2(Student)
(2) 投影(Project) ,代表符號:π
是指從資料表中,只抓取部分欄位的資料。例如 : 從學生資料表只抓取姓名的資料。
πname(Student)
(3) 聯集(Union) ,代表符號:∪
是指兩個資料表全部取出,但是重複的只出現一次。例如 : 聯集兩個學生資料表
R∪S
(4) 卡氏積(Cartesian Product) ,代表符號:×
是指兩個資料表相乘。例如 : R×S
(5) 差集(Difference) ,代表符號:─
是指兩個資料表相減。例如 : R─S
(6) 合併(Join) ,代表符號:⋈
是指將兩關聯表R與S依合併條件合併成一個新的關聯表R3 ,假設P為合併條件,以R⋈pS表示此合併運算。
~ 自然合併(Natural Join);又稱為內部合併(Inner Join)
~ θ-合併(Theta Join)
~ 對等合併(Equi-Join):是θ-合併的特例 (條件是等號時)
~ outer join (left outer/right outer/full outer)
參考資料
https://www.slideshare.net/rajupadhyay6/relational-algebratypes-of-join
https://www.mysql.tw/2014/05/blog-post_21.html
https://www.youtube.com/watch?v=jC1AcjOpmIY
範例 :
內部合併(Inner Join):
[INNER JOIN]
SELECT * FROM tableA a INNER JOIN tableB b ON a.key=b.key;
SELECT * FROM tableA a INNER JOIN tableB b USING (key);
SELECT * FROM tableA a, tableB b WHERE a.key=b.key;
如下,有學生資料表與課程資料表,請找出各學生的修課詳細列表
θ-合併(Theta Join):
πname(Hospitals⋈distance(location,location)<5Schools)
找到所有距離學校五英里以內的醫院名稱
SELECT distinct h.name FROM Hospitals h, Schools s
WHERE distance(h.location, s.location)<5
πname(Hospitals⋈distance(location,location)=5Schools)
找到所有距離學校剛好五英里的醫院名稱
SELECT distinct h.name FROM Hospitals h, Schools s
WHERE distance(h.location, s.location)=5
其他範例 ~
Left Outer Join:
[LEFT OUTER JOIN/LEFT JOIN]
SELECT * FROM tableA a LEFT OUTER JOIN tableB b ON a.key=b.key WHERE [conditions];
SELECT * FROM tableA a LEFT OUTER JOIN tableB b USING (key) WHERE [conditions];
如下,列出職員詳細資料
Right Outer Join:
[RIGHT OUTER JOIN/RIGHT JOIN]
SELECT * FROM tableA a RIGHT OUTER JOIN tableB b ON a.key=b.key WHERE [conditions];
SELECT * FROM tableA a RIGHT OUTER JOIN tableB b USING (key) WHERE [conditions];
如下,列出各部門的職員資料
Full Outer Join:
FULL OUTER JOIN 因為MYSQL沒有支援,故使用RIGHT JOIN跟LEFT JOIN進行UNION,語法如下:
SELECT * FROM tableA a RIGHT JOIN tableB b ON a.key=b.key
WHERE b.key IS NULL
UNION
SELECT * FROM tableA a LEFT JOIN tableB b ON a.key=b.key
WHERE b.key IS NULL;
(7) 交集(Intersection) ,代表符號:∩
是指只取兩個資料共有的部分。例如 : R∩S = R∩S=R-(R-S)=S-(S-R)
範例 :
交集(Intersection),以符號Ç,例如R1ÇR2
聯集(Union),以符號È表示 ,例如R1ÈR2
差集(Difference),以符號 - 表示,例如R1-R2
如上面資料表,有Student跟Assistant兩個關聯(資料表)
(b) Result (sId, sName) = Student∩Assistant
SELECT sID,sName FROM Student WHERE sID IN (SELECT aID FROM Assistant)
(c) Result (sId, sName) = Student∪Assistant
(SELECT sID, dName FROM Student) UNION (SELECT aID,aName FROM Assistant)
(d) Result (sId, sName) = Student - Assistant
SELECT sID,sName FROM Student WHERE sID NOT IN (SELECT aID FROM Assistant)
(e) Result (aId, aName) = Assistant - Student
SELECT aID,aName FROM Assistant WHERE aID NOT IN (SELECT sID FROM Student)
(8) 除法(Division) ,代表符號:÷
R1÷R2 以第一個表格當被除數,以第二個表格當除數。 第一個關聯表格當作是「被除表」,第二個關聯表格當作是「除 表」。此運算是在關聯表格 R1中找出包含關聯表格R2 中屬性值 的值組。
實作練習 : https://www.mysql.tw/2014/05/blog-post_21.html
0 留言