數據庫關係代數表達式學習
關係代數是關係數據庫系統查詢語言的理論基礎
一、關係代數的9種操作:
關係代數中包括了:並、交、差、乘、選擇、投影、聯接、除、自然聯接等操作。
五個基本操作:
並(∪)、差(-)、笛卡爾積(×)、投影(σ)、選擇(π)
四個組合操作:
交(∩)、聯接(等值聯接)、自然聯接(R
S)、除法(÷)
注2:等值連接表示先做笛卡爾積(×)之後,對相應列進行選擇或等值關聯後的結果(僅篩選行、不篩選列)
注2:自然連接表示兩個關係中若有相同名稱的屬性,則自動作爲關聯條件,且僅列出一列
二、關係代數表達式:
由關係代數運算經有限次複合而成的式子稱爲關係代數表達式。這種表達式的運算結果仍然是一個關係。可以用關係代數表達式表示對數據庫的查詢和更新操作。
三、舉例說明:
設教學數據庫中有3個關係:
學生關係S(SNO, SNAME,AGE,SEX)
學習關係SC(SNO,CNO,GRADE)
課程關係C(CNO,CNAME,TEACHER)
(1) 檢索學習課程號爲C2的學生學號與成績
------------------------------------
SELECT SNO,GRADE
FROM SC
WHERE CNO='C2'
------------------------------------
π SNO, GRADE (σ CNO='C2' (SC))
************************************
(2) 檢索學習課程號爲C2的學生學號與姓名
------------------------------------
SELECT SC.SNO,S.SNAME
FROM SC,S
WHERE SC.SNO=S.SNO
AND SC.CNO='C2'
------------------------------------
π SNO,SNAME (σ CNO='C2' (S SC))
此查詢涉及S和SC,先進行自然連接,然後再執行選擇投影操作。
----
π SNO,SNAME (S) (π SNO (σ CNO='C2' (SC)))
自然連接的右分量爲"學了C2課的學生學號的集合"。
此表達式比前一個表達式優化,執行起來要省時間、省空間。
************************************
(3) 檢索選修課程名爲MATHS的學生學號與姓名
------------------------------------
SELECT SC.SNO,S.SNAME
FROM SC,S,C
WHERE SC.SNO=S.SNO
AND SC.CNO=C.CNO
AND C.CNAME='MATHS'
------------------------------------
π SNO, SANME (σ CNAME='MATHS' (S SC C))
************************************
(4) 檢索選修課程號爲C2或C4的學生學號
------------------------------------
SELECT SNO
FROM SC
WHERE CNO='C2'
OR CNO='C4'
------------------------------------
π SNO (σ CNO='C2'∨CNO='C4' (SC))
************************************
(5) 檢索至少選修課程號爲C2或C4的學生學號
------------------------------------
SELECT SA.SNO
FROM SC AS SA,SC AS SB
WHERE SA.SNO=SB.SNO
AND SA.CNO='C2'
AND SB.CNO='C4'
------------------------------------
π 1 (σ 1=4∧2='C2'∧5='C4' (SC×SC))
************************************
(6) 檢索不學C2課的學生姓名與年齡
------------------------------------
SELECT SNAME,AGE
FROM S
MINUS
SELECT S.SNAME,S.AGE
FROM SC,S
WHERE SC.SNO=S.SNO
AND SC.CNO='C2'
(Oracle)
------------------------------------
π SNAME, AGE (S)-π SNAME, AGE (σ CNO='C2'(S
SC))
************************************
(7) 檢索學習全部課程的學生姓名
------------------------------------
方法一:
select Sname from S
where Sno IN (select Sno from SC group by Sno
having count(*) = (select count(*) from C)).
這裏group by是對關係分組,having是在分組之上加條件。
方法二:
select Sname from S
where not exists(select * from C
where not exists(select * from SC
where Sno=S.Sno and Cno=C.Cno)).
查詢學生,不存在一門課程這個學生沒有選。(不存在一門課程不存在在該學生選修的課程裏面)。
------------------------------------
π SNO, CNO (SC)÷π CNO (C)
先用除法取出選取所有課程的SNO集(除法可以理解爲一個Filter)
π SNAME (S (π SNO,CNO (SC)÷π CNO (C)))
再關聯S表取出SNAME
************************************
(8) 檢索所學課程包含S3所學課程的學生學號
------------------------------------
select distinct Sno from SC X
where not exists(select * from SC Y
where Y.Sno='S3' and not exists (select * from SC Z
where Z.Sno=X.Sno and Z.Cno=Y.Cno)).
查詢學生,不存在這樣的課程t,學生S3選修了t,而要查詢的學生沒有選修。
------------------------------------
π SNO,CNO (SC)÷ π CNO (σ SNO='S3' (SC))
同樣運用了除法的特性
(1).找出學號爲S3的學生所選的課程。
(2).找出至少選了這些課程的學生。
************************************
(9) 將新課程元組( 'C10','PHYSICS','YU')插入到關係C中
------------------------------------
INSERT INTO C VALUES('C10','PHYSICS','YU')
------------------------------------
(C∪ ('C10','PHYSICS','YU'))
記住該符號的用法
************************************
(10) 將學號S4選修課程號爲C4的成績改爲85分
------------------------------------
UPDATE SC SET GRADE=85
WHERE SNO='S4'
AND CNO='C4'
------------------------------------
(SC- ('S4','C4',? )∪ ('S4','C4',85))
先用'- '實現DELETE功能,再用'∪'實現INSERT功能
注意使用?來表示檢索時忽略該字段值
************************************
四、關係代數表達式的優化:
目的 :爲了系統在執行時既省時間又能提高效率。
基本策略 :先做選擇,運用投影去除多餘屬性等等。
優化算法 :語法樹(儘量提前做選擇操作;在每個操作後,應做個投影操作,去掉不用的屬性值)
例如:
π SNO ,SNAME (σ GRADE>60 (S SC)) 進行 優化後轉換爲:
π SNO ,SNAME (π SNO ,SNAME (S) π SNO (σ GRADE>60 (SC)))
--即提前做選擇操作;在每個操作後,應做個投影操作,去掉不用的屬性值
又如:
S(S#,SNAME,AGE,SEX)
SC(S#,C#,GRADE)
C(C#,CNAME,TEACHER)
π CNAME,TEACHER (σ SEX='女' (S SC C))進行 優化後轉換爲:
π CNAME, TEACHER (C π C# (π S#,C# (SC) π S# (σ SEX='女' (S))))
優化前和優化後的語法樹如下所示: