關係代數和SQL練習(二)

數據庫關係代數表達式學習

關係代數是關係數據庫系統查詢語言的理論基礎

一、關係代數的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))
此查詢涉及SSC,先進行自然連接,然後再執行選擇投影操作。
----
π 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) 檢索選修課程號爲C2C4的學生學號
------------------------------------
SELECT SNO
  FROM SC
WHERE CNO='C2'
    OR CNO='C4'
------------------------------------
π SNO (σ CNO='C2'∨CNO='C4' (SC))
************************************


(5) 檢索至少選修課程號爲C2C4的學生學號
------------------------------------
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))))

    優化前和優化後的語法樹如下所示:

 

發佈了41 篇原創文章 · 獲贊 53 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章