關聯式代數

Relational Algebra(關聯式代數)
依性質分為以下
Unary Relational Operation(一元關聯操作):對單一關聯操作
Binary Relational Operation(二元關聯操作):對兩個關聯操作,主要在於join(合併)
Set Theory Operation(集合論操作):以集合論為基礎
Aggregate Function(聚合函數)計算

Set Theory Operation
包括
Intersection Operation(交集操作)
Union Operation(聯集操作)
Difference Operation(差集操作)

Aggregate Functions
聚合函數包括
計算加總的Sum()函數
計算平均的Average()函數
計算筆數的Count()函數
最大值的Max()函數
最小值的Min()函數
表示法為:< 群組屬性> F< 函數表列>(column operation)(R)
ex:
< 訂單編號> F sum(實際單價×數量)(訂單明細)

………………

Unary Relational Operation
包括
SELECT operation(選取操作)
 從table中選取col=value的資料
 表示法為sigma(col=value)(table)
PROJECT operation(投影操作)
 只顯示table中col1[,col2,…]欄位的資料
 表示法為pi(col1[,col2,…])(table)
RENAME operation(更名操作)
 表示法為暫存關聯(new col name1[,new col name2,…])=SELECT or PROJECT operation

暫存關聯
暫時儲存某些操作後所產生的關聯
目的:將一連串的操作分為數個獨立的操作分別進行
ex1:
第一種
1先篩選資料
男性員工 = sigma(性別=‘男’)(員工)
2在篩選欄位
pi(員工編號,姓名,職稱,性別,地址)(男性員工)
ex2:
第二種
1先篩選欄位
暫存員工= pi(員工編號,姓名,職稱,性別,地址)(員工)
2在篩選資料
sigma(性別=‘男’)(暫存員工)

將一連串的操作整合成單一操作進行
ex1:
先投影操作,後選取操作
sigma(col=value)(
pi(col1[,col2,…])(table1)
)
ex2:
先投影操作,後選取操作
pi(col1[,col2,…])(
sigma(col=value)(table2)
)
ps
注意事項,不可交換的情形
ex:
投影操作時無性別的欄位,因此在選取操作無法依性別做過濾
sigma(性別=‘男’)(
pi(員工編號,姓名,職稱,地址)(員工)
)

ex1
列出員工sex(性別)為M,salary(薪水)>32000的員工姓名(EMPLOYEE.fname,EMPLOYEE.lname)
pi(fname,lname)(
sigma(sex=M && salary>32000)(employee)
)
…………………………………………………………………………….

Binary Relational Operation
包括
CROSS JOIN
 表示法為R X S
THETA JOIN
 表示法為R X(條件情形) S
 包含==,< ,>,!=,=>,=<
EQUIJOIN JOIN 屬於THETA JOIN的子集合
 只包含==, 相同屬性仍然會在出現,也就是會有2欄位名稱一樣
 表示法為R |X| (條件情形)S
 ex: (R) |X|(R.a=S.b)(S) 留下R.a和S.b
NATURE JOIN
 只包含==,相同屬性只會出現一次,也就是只留下一欄位
 表示法為R * (條件情形)S = R |X|(r.a=s.b)S
 ex: (R) *(R.a=S.b)(S) 只留下R.a
OUTER JOIN
 表示法分為
 left outer join R ]x| (條件情形)S
 right outer join R |x[ (條件情形)S
 full outer join R ]x[ (條件情形)S

…………


ex1
找出john smith的親屬(depedent_name,relationship)

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
depandent(essn,depandent_name,sex,bdate,relationship)
1
找出employee為john smith的資料
emp_john=pi(fname,lname,ssn) (
sigma(fname=john && lname=smith)(employee)
)
2
john親屬條件emp.ssn=depadent.ssn
pi(depedent_name,relationship)(
(employee) |X|(emp_john.ssn=depadent.essn)(depandent)
)
ex2
列出每個部門的經理姓名(DEPARTMENT.dname,EMPLOYEE.fname,EMPLOYEE.lname)

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
department(dname,dnumber,mgr_ssn,mgr_start_date)
1
pi(dname,fname,lname)(
(department) |X|(department.mgr_ssn=employee.ssn)(employee)
)
ex3
列出專案productx目前有那些員工在負責(employee.fname,employee.lname)

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
project(pname,pnumber,plocation,dnum)
works_on(essn,pro,hours)
1
ptab=pi(pname,pnumber)(
sigma(pname=projectx)(project)
)
2
pwtab=pi(essn)(
(ptab)|X|(pnumber=pro)(works_on)
)
3
result=pi(fname,lname)(
(pwtab)|X|(essn=ssn)(employee)
)
ex4
列出每個專案目前有哪些員工負責(PROJECT.pname,EMPLOYEE.fname,EMPLOYEE.lname)

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
project(pname,pnumber,plocation,dnum)
works_on(essn,pro,hours)
方法a
1
pwtab=pi(essn,pname)(
(project)|X|(pnumber=pno)(works_on)
)
2
result=pi(PWTAB.pname,EMPLOOYEE.fname,EMPLOYEE.lname)(
(pwtab)|X|(essn=ssn)(employee)
)
方法b
R1=((project)|X|pnumber=pno(works_on))|X|essn=ssn(employee)
result=pi(pname,fname,lname)(R1)
方法c
result=pi(PROJECT.pname,EMPLOOYEE.fname,EMPLOYEE.lname)(
 (employee)|X|(ssn=essn)(
  (project)|X|(pnumber=pno)(works_on)  
  )
 )
ex5
列出負責專案所在地為houston的員工,但部門不在houston(fname,lname,address)

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
project(pname,pnumber,plocation,dnum)
works_on(essn,pro,hours)
dept_locations(dnumber,dlocation)
1
R1=(((project)|X|pnumber=pno(works_on))|X|essn=ssn(employee))|X|dno=dnumber(dept_locations)
2
result=pi(fname,lname,address)(
segma(dlocation=houston && plocation=houston)(R1)
)

ps:
遞迴封閉式操作
員工 = pi(員工編號, 姓名, 報告人)(員工)
上司 = pi(員工編號, 姓名, 職稱, 報告人)(員工)
tmp_result = (員工)|X| 員工.報告人=上司.員工編號 && 職稱=’業務經理'(上司)
result = pi(員工.員工編號, 員工.姓名, 上司.員工編號, 上司.姓名)(tmp_result )

…………………………………………….

集合除法
R / S
列出S在R中同時出現的資料

R(a ,b)
a1 b1
a1 b2
a2 b1
a2 b3
a3 b1
a3 b2
a3 b3
S(b)
b1
b2
R/S
S中b的b1,b2在R中a1,a3資料中
(a)
a1
a3


ex1
列出同時在每個專案中工作的員工(EMPLOYEE.fname,EMPLOYEE.lname)

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
project(pname,pnumber,plocation,dnum)
works_on(essn,pro,hours)
1
R(pno)=pi(pnumber)(project)
2
在works_on中取得擁有全部R.pno(=WORKS_ON.pno)的essn
R1=(work_on)/(R)
3
result=pi(fname,lname)(
(EMPLOYEE)|X|ssn=essn(R1)
)

………………………………………………………………

集合減法
R – S

R(ssn)
1
2
3
4
5
S(ssn,pno)
1 a
2 a
3 a
4 a
1 b
2 b
3 b
1 c
3 c 
R-S
R中的5沒有出現在S的ssn資料中
(ssn)
5

ex1
列出沒有專案的員工

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
project(pname,pnumber,plocation,dnum)
works_on(essn,pro,hours)
1
R1(ssn)=pi(essn)(works_on)
2
R2(ssn)=pi(ssn)(employee)
3
R3=R2-R1
4
result=pi(fname,lname)(
(employee)*(R3)
)
ex2
列出無親屬的經理

資料表如下
employee(fname,minit,lname,ssn,bdate,address,sex,salary,super_ssn,dno)
depandent(essn,depandent_name,sex,bdate,relationship)
1
R(ssn)=pi(super_ssn)(employee)
2
S(ssn)=pi(essn)(dependent)
3
T=R-S