SQL的關聯式代數(Relational Algebra)是什麼?





關聯式代數(Relational Algebra)是什麼?

關聯式資料庫系統具有查詢語言可以用來操作資料庫,以數學來表示的查詢語言有兩大類關聯式代數(Relational Algebra)與關聯式計算(Relational Calculus)。這兩種都可以用來「描述」真正的查詢語言(SQL)。

關聯式代數(Relational Algebra)範例 : πnamedep_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) ,代表符號:─

是指兩個資料表相減。例如 : RS

(6) 合併(Join) ,代表符號:⋈

是指將兩關聯表R與S依合併條件合併成一個新的關聯表R3 ,假設P為合併條件,以RpS表示此合併運算。

~ 自然合併(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(Hospitalsdistance(location,location)<5Schools)

找到所有距離學校五英里以內的醫院名稱

SELECT distinct h.name FROM Hospitals h, Schools s
WHERE distance(h.location, s.location)<5


對等合併(Equi-Join):就是theta-join的特例,也就是如上的小於改成等號

πname(Hospitalsdistance(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 留言