基本運(yùn)算
每一種基本運(yùn)算的結(jié)果都是一個新的關(guān)系,可以用這個關(guān)系繼續(xù)參與運(yùn)算霹菊,借此便可進(jìn)行復(fù)雜的運(yùn)算
-
選擇運(yùn)算(select)==>相當(dāng)于SQL語句中的WHERE子句的職能
-
格式:σ選擇謂詞(關(guān)系)
- 舉個栗子:
σSAL>1000(EMP)
上式表示取出查詢工資大于1000的所有員工的信息
等價于下面的SQL語句
SELECT * FROM EMP WHERE SAL > 1000
- 選擇謂詞的分類
- 比較:=、≠蜈彼、<案狠、≤、>和≥
- 連詞:and(∧)延都、or(∨)和not(?)==>可以將多個謂詞合并成一個大的謂詞
- 可以包括兩個屬性(字段的比較):σCOMM>SAL(EMP)表示抽成大于工資的人
-
-
投影運(yùn)算(project)==>相當(dāng)于SQL語句中的SELECT子句的職能
-
格式:∏字段序列(關(guān)系)
- 舉個栗子
∏ENAME,SAL(EMP)
上式表示查看所有員工的姓名和工資
等價于下面的SQL語句
SELECT ENAME, SAL FROM EMP
-
-
關(guān)系的組合運(yùn)算==>就像SQL中select、where子句那樣的組合效果
- 舉個栗子
∏ENAME,SAL(σSAL>1000(EMP))
上面的式子求出了所有工資大于1000的員工的名字和工資(實際上就是將σSAL>1000(EMP)執(zhí)行的結(jié)果當(dāng)做一個臨時的關(guān)系睛竣,參與了投影運(yùn)算得到的)
等價于下面的SQL語句
SELECT ENAME, SAL FROM EMP WHERE SAL > 1000
- 事實關(guān)系的組合運(yùn)算就是那么簡單晰房,分析的時候把每個簡單運(yùn)算的結(jié)果當(dāng)做一個新的關(guān)系參與后面的運(yùn)算,這樣一層層剝開來射沟,再復(fù)雜的語句也變得容易分析
- 舉個栗子
-
并運(yùn)算(union)==>相當(dāng)于SQL中UNION關(guān)鍵字的職能
-
格式:(關(guān)系r)∪(關(guān)系s)
- 舉個栗子
∏ENAME,SAL(σSAL>1000(EMP)) ∪ ∏ENAME,SAL(σCOMM>300(EMP))
上面的式子求出了所有工資大于1000或抽成大于300的員工的姓名和工資殊者,等價于下面的SQL語句
SELECT ENAME, SAL FROM EMP WHERE SAL > 1000 UNION SELECT ENAME, SAL FROM EMP WHERE COMM > 300
-
幾點(diǎn)需要額外注意的:
此處的并運(yùn)算是集合運(yùn)算,所以結(jié)果是去重的验夯,結(jié)果集中不存在重復(fù)的元組(而在SQL語句中猖吴,指定UNION ALL是可以保留重復(fù)的)
關(guān)系r與關(guān)系s必須是同元的,即它們的屬性的數(shù)目要求必須相同(這就和SQL語句中UNION使用的時候要求上下兩個語句的字段數(shù)相同是一樣的意思)
關(guān)系r和關(guān)系s對應(yīng)位置的屬性域應(yīng)該是類型兼容的(同樣和SQL中UNION使用時挥转,每個對應(yīng)位置字段類型兼容是一樣的意思)
-
-
集合的差運(yùn)算(set-defference)==>相當(dāng)于SQL語句中的EXCEPT
-
格式:(關(guān)系r)-(關(guān)系s)
- 舉個栗子
- ∏ENAME,SAL(σSAL>1000(EMP)) - ∏ENAME,SAL(σCOMM>300(EMP))
- 上面的式子表示工資大于1000但抽成不大于300的員工的姓名和工資海蔽,等價于下面的SQL語句
SELECT ENAME, SAL FROM EMP WHERE SAL > 1000 EXCEPT SELECT ENAME, SAL FROM EMP WHERE COMM > 300
-
幾點(diǎn)需要額外注意的:
- 此處的注意同上面的并運(yùn)算的注意事項
-
-
笛卡爾積運(yùn)算(Cartesian-product)==>等價于SQL語句中兩個表進(jìn)行笛卡爾積(全匹配)得到的結(jié)果共屈,即SQL中進(jìn)行多表連接時不指定連接條件的情況
-
格式:(關(guān)系r)×(關(guān)系)
- 舉個栗子:
- EMP × DEPT
- 上面的式子表示兩個表進(jìn)行全匹配,等價于下面的SQL語句
SELECT * FROM EMP, DEPT
- 下面兩個式子是等價的
- ∏ENAME,DNAME(σEMP.DEPTNO=DEPT.DEPTNO(σJOB="MANAGER"(EMP×DEPT)))
- ∏ENAME,DNAME(σEMP.DEPTNO=DEPT.DEPTNO((σJOB="MANAGER"(EMP))×DEPT)
- 下面是對這兩個式子的SQL轉(zhuǎn)化党窜,轉(zhuǎn)化之后就一目了然了
-- 對應(yīng)第一個式子 SELECT ENAME, DNAME FROM EMP JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO WHERE JOB = 'MANAGER' -- 對應(yīng)第二個式子 SELECT ENAME, DNAME FROM DEPT JOIN (SELECT * FROM EMP WHERE JOB = 'MANAGER') ON EMP.DEPTNO = DEPT.DEPTNO
-
-
更名運(yùn)算(rename)==>等價于SQL語句中as的職能
-
格式:ρX(A1,A2,...,An)(E)==>表示的是將關(guān)系E更名為X趁俊,Ai表示的是給E的第i個字段指定別名
- 舉個栗子
- ∏ENAME,DNAME(σe.DEPTNO=d.DEPTNO(σJOB="MANAGER"(ρe(EMP)×ρd(DEPT))))
- 上面式子含義就不解釋了,是上面舉的栗子刑然,只是引入了更名運(yùn)算符,它等價于下面的SQL語句
SELECT ENAME, DNAME FROM EMP e JOIN DEPT d ON e.DEPTNO = d.DEPTNO WHERE JOB = 'MANAGER'
-
-
來暇务,學(xué)習(xí)完上面的基本運(yùn)算泼掠,來做個實際的栗子,要求找到員工表中的最高工資(因為目前還沒有介紹類似SQL中組函數(shù)的操作垦细,后面會介紹择镇。所以通過以下方式來實現(xiàn))
- step1: 找到所有不是最高工資的人
- ∏e1.SAL(σe1.sal < e2.sal(ρe1(EMP)×ρe2(EMP)))
- step2: 用所有的員工減去上面的員工,即得到最高工資
- ∏SAL(EMP) - ∏e1.SAL(σe1.sal < e2.sal(ρe1(EMP)×ρe2(EMP)))
- step1: 找到所有不是最高工資的人
-
在書寫關(guān)系運(yùn)算表達(dá)式的時候可以用序列號代替字段名(但是不直觀括改,不常用腻豌,一般不用)
- 舉個栗子
- ∏$6(σ$6 < $14(EMP×EMP))
- 等價于下面的運(yùn)算
- ∏e1.SAL(σe1.sal < e2.sal(ρe1(EMP)×ρe2(EMP)))
- 舉個栗子
附加運(yùn)算
附加運(yùn)算是由基本運(yùn)算組成的,不能增強(qiáng)基本運(yùn)算的運(yùn)算能力嘱能,但是能簡化運(yùn)算
-
集合交運(yùn)算(intersection)==>相當(dāng)于SQL語句中INTERSECT關(guān)鍵字的職能
-
格式:(關(guān)系r)∩(關(guān)系s)
- 因為集合交運(yùn)算是可以由前面的基本運(yùn)算組合產(chǎn)生的吝梅,所以把它歸到附加運(yùn)算
- A ∩ B <=> A - (A - B)
- 舉個栗子
- ∏ENAME,SAL(σSAL>1000(EMP)) ∩ ∏ENAME,SAL(σCOMM>300(EMP))
- 上面的式子表示工資大于1000并且抽成大于300的員工的姓名和工資,等價于下面的SQL語句
SELECT ENAME, SAL FROM EMP WHERE SAL > 1000 INTERSECT SELECT ENAME, SAL FROM EMP WHERE COMM > 300
-
-
自然連接(natural join)==> 相當(dāng)于SQL語句中的NATURAL JOIN
-
格式:(關(guān)系)?(關(guān)系)
-
自然連接的形式化定義
- r,s是兩個關(guān)系
- R惹骂,S是上面兩個關(guān)系對應(yīng)的關(guān)系模式(其實就是上述兩個關(guān)系各自的屬性列表)
- R ∩ S 表示r和s的同名屬性列表
- R ∪ S 表示出現(xiàn)在r或s上的屬性名列表(是一個集合苏携,不包同名屬性,存在同名屬性會去重)
- R - S 表示出現(xiàn)在R上对粪,但不出現(xiàn)在S上的屬性名列表
- 則可做如下定義
- r?s = ∏R∪S(σr.A1=s.A1 ∧ r.A2=s.A2 ∧ ... ∧ r.An=s.An(r×s)) 右冻,其中 R∩S={A1, A2, ..., An}
- 舉個栗子
- ∏name, course_id(instructor ? teaches)
- 上面的式子列出了所有老師的名字以及其所授課程的id,等價于下面的SQL語句
SELECT name, course_id FROM intructor natural join teaches
ps: 兩個關(guān)系模式執(zhí)行自然連接以后屬性的排布順序:
- 排在最前面的是兩個關(guān)系模式相同的屬性
- 其次是只屬于第一個關(guān)系模式的屬性
- 最后是只屬于第二個關(guān)系模式的屬性
V谩I磁ぁ!所以所兩個關(guān)系模式進(jìn)行自然連接以后儡遮,總的屬性的個數(shù)是減少了乳蛾,具體減少的個數(shù)等于同名屬性的個數(shù)
-
-
theta連接==>是帶限定條件的笛卡爾積
-
格式:(關(guān)系)?Θ(關(guān)系)
- 形式化定義:
- r ?Θ s = σΘ(r × s)
- 舉個栗子
- ∏name, course_id(instructor ?instructor.ID = teaches.ID ∧ instructor.salary > 5000 teaches)
- 上面的式子表示列出所有工資大于5000的老師的名字以及其所授課程的id, 等價于下面的SQL語句
-- 使用 join...on 的時候 on 后面寫連接條件鄙币,然后將其它條件放在where里 SELECT name, course_id FROM instructor join teaches on instructor.ID = teaches.ID WHERE instructor.salary > 5000
-
-
除運(yùn)算(division)
這個在書上沒講屡久,是老師上課的時候補(bǔ)充的
-
格式:(關(guān)系)÷(關(guān)系)
- 形式化定義:
R÷S = ∏R∪S( ( ∏R-S(r) × S ) - ∏R-S, S(r) ) - 解釋起來挺麻煩的,這邊給出一個博客鏈接:點(diǎn)我
-
-
賦值運(yùn)算
就是將一個關(guān)系表達(dá)式的結(jié)果賦值取一個臨時的名字爱榔,就相當(dāng)于定義了一個臨時關(guān)系被环。這個操作就相當(dāng)于SQL中with語句的職能
-
格式: temp_name ← 關(guān)系表達(dá)式
- 舉個栗子:
temp1 ← R × S
temp2 ← σr.A1=s.A1 ∧ r.A2=s.A2 ∧ ... ∧ r.An=s.An(temp1)
result = ∏R∪S(temp2) - 上面的式子等價于: result = r?s
-
-
外連接運(yùn)算
- 左外連:?
- 右外連:?
- 全外連:?
擴(kuò)展運(yùn)算
擴(kuò)展運(yùn)算是不能用基本的關(guān)系代數(shù)運(yùn)算來實現(xiàn)的一類查詢,可以滿足復(fù)雜的查詢需求
-
廣義投影(Generalized-projection)
與基本運(yùn)算中的投影運(yùn)算相比详幽,就是多了允許在選擇列表中出現(xiàn)表達(dá)式(在基本運(yùn)算中的投影的選擇列表中只能出現(xiàn)字段)
-
格式:∏F1, F2, ... , Fn(E)
- 其中F1, F2, ... , Fn可以是字段或者是表達(dá)式
- E代表一個關(guān)系
- 舉個栗子:
∏name, sal * 1.2(instructor)
上面的式子表示查出所有老師的名字筛欢,以及漲了20%以后的工資浸锨,等價于下面的SQL語句
SELECT name, sal * 1.2 FROM instructor
-
-
聚集函數(shù)(Aggregation function)
聚集函數(shù)的符號表示是用書寫體G,這邊就直接用G指代了
聚集函數(shù)是輸入值的一個匯聚版姑,以多個值作為輸入柱搜,將一個單一的值作為返回結(jié)果
多重集:使用聚集函數(shù)對其進(jìn)行操作的匯集中,一個值可以出現(xiàn)多次剥险,值出現(xiàn)的順序是無關(guān)緊要的聪蘸。這樣的匯集稱為多重集(就比方說統(tǒng)計一個員工表中員工的數(shù)量,然后我們通過統(tǒng)計員工的名字來統(tǒng)計表制,即便是同名的員工我們也是計算的)
-
格式: G1, G2, ... , GnGF1(A1), F2(A2), ..., Fn(An)(E)
- 其中前面的G1, G2, ... , Gn表示的是分組條件
- 后面的F1(A1), F2(A2), ..., Fn(An)是聚集函數(shù)表達(dá)式列表
- Fi(i = 1, 2, ..., n)表示聚集函數(shù):sum健爬、count、average么介、max娜遵、min
- A1, A2, ... , An代表字段
- 舉個栗子:
- A1, A2Gsum(A3)(∏A1, A2, ..., An(σP(r1×r2×...×rm)) )
- 等價于下面的SQL語句
SELECT A1, A2, sum(A3) FROM r1, r2, ..., rm WHERE P GROUP BY A1, A2
- 上面的聚集函數(shù)在進(jìn)行計算的時候采用的都是多重集,也就是相同的值可以多次重復(fù)計算(也就是在執(zhí)行聚集函數(shù)的時候是不去重計算)壤短,如果要去重計算的話就要采用下面的幾個函數(shù)寫法
- sum_distinct
- count_distinct
- averag_distinct
- max_distinct
- min_distinct
- 舉個栗子:
- A1, A2Gsum_distinct(A3)(∏A1, A2, ..., An(σP(r1×r2×...×rm)) )
- 上面的式子等價于下面的SQL語句
SELECT A1, A2, sum(distinct A3) FROM r1, r2, ..., rm WHERE P GROUP BY A1, A2
-