資料庫 - 關係演算

Simon.Wang發表於2015-05-05

關係演算

以數理邏輯中的謂詞演算為基礎
按謂詞變元不同 進行分類
1.元組關係演算:
以元組變數作為謂詞變元的基本物件
元組關係演算語言ALPHA
2.域關係演算:
以域變數作為謂詞變元的基本物件
域關係演算語言QBE

由E.F.Codd提出
INGRES所用的QUEL語言是參照ALPHA語言研製的
語句
檢索語句
GET
更新語句
PUT,HOLD,UPDATEDELETEDROP

檢索操作

語句格式:
     GET 工作空間名  [(定額)](表示式1)
               [:操作條件] [DOWN/UP 表示式2]
 定額:規定檢索的元組個數
格式:        數字
表示式1:指定語句的操作物件
格式:
關係名| 關係名. 屬性名| 元組變數. 屬性名| 集函式 [,…  ]
操作條件:將操作結果限定在滿足條件的元組中
格式:        邏輯表示式
表示式2:指定排序方式
格式:        關係名. 屬性名| 元組變數. 屬性名[,…  ]

(1)簡單檢索

GET 工作空間名 (表示式1)

[例1] 查詢所有被選修的課程號碼。
GET W (SC.Cno)
[例2] 查詢所有學生的資料。
GET W (Student)
格式
GET 工作空間名(表示式1):操作條件

[例3]查詢資訊系(IS)中年齡小於20歲的學生的學號和年齡
    GET  W  (Student.SnoStudent.Sage): 
     Student.Sdept='IS' Student.Sage<20

格式
GET 工作空間名(表示式1)[:操作條件]
DOWN/UP 表示式2

  [例4]查詢電腦科學系(CS)學生的學號、年齡,結果按年齡降   
           序排序
    GET  W  (Student.Sno,Student.Sage):
               Student.Sdept='CS‘ DOWN Student.Sage

格式
GET 工作空間名(定額)(表示式1)
[:操作條件] [DOWN/UP 表示式2]

[例5]  取出一個資訊系學生的學號。
    GET  W  (1)  (Student.Sno):
             Student.Sdept='IS' 
[例6]  查詢資訊系年齡最大的三個學生的學號及其年齡,結果按年齡降序排序。
        GET  W (3)  (Student.Sno,Student.Sage):
         Student.Sdept='IS' DOWN Student.Sage

用元組變數的檢索

元組變數的含義
表示可以在某一關係範圍內變化(也稱為範圍變數Range Variable)
元組變數的用途
① 簡化關係名:設一個較短名字的元組變數來代替較長的關係名。
② 操作條件中使用量詞時必須用元組變數。
定義元組變數
格式:RANGE 關係名 變數名
一個關係可以設多個元組變數

用存在量詞的檢索

操作條件中使用量詞時必須用元組變數

[例8]  查詢選修2號課程的學生名字。
   RANGE  SC  XGET W (Student.Sname): X(X.Sno=Student.SnoX.Cno='2')
[例9] 查詢選修了這樣課程的學生學號,其直接先行課是6號課程。
   RANGE Course  CX
   GET  W  (SC.Sno): 
  CX (CX.Cno=SC.Cno∧CX.Pcno='6')
[例10]查詢至少選修一門其先行課為6號課程的學生名字
           RANGE  Course  CX
                              SC        SCX
            GET  W  (Student.Sname): SCX (SCX.Sno=Student.Sno∧
                                   CX (CX.Cno=SCX.Cno∧CX.Pcno='6')) 
 前束正規化形式: 
              GET  W  (Student.Sname): 
                      SCXCX (SCX.Sno=Student.Sno∧                                          
                                         CX.Cno=SCX.Cno∧CX.Pcno='6')

帶有多個關係的表示式的檢索

 [例11]  查詢成績為90分以上的學生名字與課程名字。
     RANGE  SC  SCX
     GET  W(Student.Sname,Course.Cname):       
            SCX (SCX.Grade90 ∧ 
              SCX.Sno=Student.Sno∧
              Course.Cno=SCX.Cno)

用全稱量詞的檢索

 [例12]  查詢不選1號課程的學生名字
          RANGE  SC  SCX
          GET  W (Student.Sname):
         SCX (SCX.Sno≠Student.Sno∨SCX.Cno'1')
用存在量詞表示:
          RANGE  SC  SCX
          GET  W  (Student.Sname): 
   SCX (SCX.Sno=Student.Sno∧SCX.Cno='1')

用兩種量詞的檢索

[例13]  查詢選修了全部課程的學生姓名。
          RANGE  Course  CX
                         SC         SCX
          GET  W  (Student.Sname): 
   CX SCX (SCX.Sno=Student.Sno∧ 
                SCX.Cno=CX.Cno)

用蘊函(Implication)的檢索

 [例14]  查詢最少選修了200215122學生所選課程的學生學號
          RANGE  Couse  CX
                           SC     SCX 
                           SC     SCY
          GET  W  (Student.Sno):      CX(SCX
          (SCX.Sno=‘200215122'∧SCX.Cno=CX.Cno)SCY(SCY.Sno=Student.Sno∧                                                                   SCY.Cno= CX.Cno))

聚集函式

[例15]  查詢學生所在系的數目。
         GET  W  ( COUNT(Student.Sdept) )
      COUNT函式在計數時會自動排除重複值。

[例16]  查詢資訊系學生的平均年齡
              GET  W  (AVG(Student.Sage):                  
              Student.Sdept='IS’  )

相關文章