專門的關系運算
選擇
投影
連接
除
STUDENT(Sno,Sname,Ssex,Sage,Sdept)//學生表
COURSE(Cno,Cname,Cpno,Ccredit)//課程表
SC(Sno,Cno,Grade) //選課表
1. 選擇(Selection)
選擇又稱為限制(Restriction)
選擇運算的含義
在關系中選擇滿足給定條件的諸元組
選擇運算符σ
[例1] 查詢信息系(IS系)全體學生
σ Sdept = 'IS' (Student)
[例2] 查詢年齡小於20歲的學生
σ Sage < 20(Student)
[例3] 查詢信息系年齡小於20歲的學生
σ Sdept = 'IS' ∧ Sage < 20(Student)
∧ 邏輯與
∨ 邏輯或
注:選擇運算是從行的角度進行的運算
2. 投影(Projection)
1)投影運算的含義
從R中選擇出若干屬性列組成新的關系
投影運算符π
2)投影操作主要是從列的角度進行運算
但投影之后不僅取消了原關系中的某些列,而且還可能取消某些元組(避免重復行)
3) 舉例
[例1] 查詢學生的姓名和所在系
即求Student關系上學生姓名和所在系兩個屬性上的投影
π Sname,Sdept(Student)
[例2]查詢學生關系Student中都有哪些系
π Sdept(Student)
[例3] 查詢CS系的學生姓名
π Sname(σSdept='CS'(Student) )
[例4] 查詢沒有選過課的學號
思路:所有學生號-選過課的學生號
π Sno(Student)- π Sno(SC)
[例5]查詢沒有不及格的學號
思路:所有學號-有不及格的學號
π Sno(Student)- π Sno(σGrade < 60 (SC))
查詢沒有不及格的學號
這樣做有錯, 為什么?
π Sno(σGrade>= 60 (SC))
這是查詢有過及格的學號!!!
[例6]查未被選修的課號
所有課號 - 被選修的課號
π cno(Course) -π cno(SC)
3. 連接(Join)
1)連接運算的含義
從兩個關系的笛卡爾積中選取屬性間滿足一定條件的元組
A和B:分別為R和S上的屬性組
θ:比較運算符
2)兩類常用連接運算
等值連接(equijoin)
θ為“=”的連接運算稱為等值連接
自然連接(Natural join)
兩關系中相同屬性組的等值連接
結果中去掉重復屬性列
[例 1]查詢有成績>95的學號,姓名
分析:成績在SC表中, 姓名在STUDENT表中
如果有一張大表,有學號、姓名、成績 就好了
自然連接STUDENT和SC即可
π Sno,Sname (σgrade>95(Student連接SC) )
問題:什么時候要用到連接運算?
結論:當查詢條件和結果來自兩個關系時, 用連接
[例 2] 查詢選修了2號課程的學生的學生名。
π Sname(σCno=‘2’(Student 連接 SC ))
[例3] 查詢選修了先行課為5號課的課程的學生姓名。
π Sname(σ Cpno='5'(Student 連接 SC 連接 Course))
或
π Sname(π Sno,Sname(Student) 連接 SC 連接 σCpno='5'(Course))//性能更好
[例4] 查詢沒有選過課的學號,姓名
π Sno,Sname (Student 連接 (πSno(Student) - πSno(SC)) )
關系代數查詢
三部曲
(1)連接
(2)選擇
(3)投影
關系代數查詢思路總結
首先確定查詢哪個表
當查詢內容和條件來自多個表時---多表查詢,用自然連接
查詢條件?用選擇σ
查詢內容?用投影π
三部曲:連接---選擇---投影
題型“查詢沒有...”,用差運算-
所有… - 有…
練習題:
1.查詢CS系的學生姓名
投影 Sname(選擇 Sdept=’cs’( Student))
2.查詢有成績>90的學號
投影 Sno 選擇 Grade90(c))
3.查詢沒有被選修的課號
投影Cno(Course)-投影cno(sc)
4.查詢沒有被選修的課號,課名
投影 Cno, Cname(Course連接(投影Cno( Course)-投影cno(Sc)
5.查詢CS系成績〉90的學號,姓名
投影sno, Sname選擇 Sdept='cs'( Student)連接選擇 Grade>90(sC)連接 Student)
6.查詢數據庫原理課成績〉90的學號
投影 sno(選擇 Cname='數據庫原理'(Course)連接 選擇Grade>90(sc))
7.查詢CS系數據庫原理課成績〉90的學號,姓名
投影 Sno, Sname(選擇 Cname='數據庫原理'( Course)連接 選擇 Grade>90 (Sc )連接 Student)
4 除運算
這里先引入一個象集的概念。
象集(Image Set)
關系R(X , Y), X,Y是屬性組,x是X上的取值
從R中選出在X上取值為x的元組,去掉X上的分量,只留Y上的分量,組成的關系成為x在R中的象集Yx 。
Yx = { t[Y] | t屬於R 並且 t[X]= x }
除運算
給定關系R (X,Y) 和S (Y),其中X,Y 為屬性組。則R÷S得到一個新的關系P(X):
如果R中某元組在X上分量值x的象集Yx包含S , 則由x組成的元組就是P的元組。
R÷S = {x | S 真包含於 Yx }
Yx:x在R中的象集
[例1] 查詢至少選修1號課程和3號課程的學生號碼
這樣寫對嗎?
π Cno(σ CNO=1 ∧ cno=2(SC))
這是不對的,因為沒有一條選課記錄既選擇了1號課又選擇了2號課。
思路:
查詢這樣的學號,該學號對應的選課課號集合包含1號課和3號課的,我們就要先構造這個集合
首先建立一個臨時關系K:
k = πCNO(σ CNO=1 V CNO=3(SC))
然后求:
π Sno,Cno(SC)÷K
在這里的
πSno,Cno(SC)
是
95001象集{1,2,3}, 包含K
95002象集{2,3}, 不包含K
於是:
π Sno,Cno(SC)÷K = {95001}
[例2] 查詢選修了全部課程的學生號碼。
查詢πSno,Cno(SC)中學號, 象集包含什么?
π Sno,Cno(SC)÷ π Cno(Course)
擴展:查詢選修了全部課程的學生號碼和姓名。
π Sno,Sname((π Sno,Cno(SC)÷π Cno(Course))連接Student))
[例3]查詢選修了95002所選全部課程的學生號碼
π Sno,Cno(SC)÷π Cno(σ SNO=95002 (SC))
練習題:
1.查詢選修了全部課程的學生號碼
投影sno,cno(sc)÷投影cno( Course)
2.查詢選修了全部課程的學生號碼和姓名
投影sno, Sname((投影sno,cno(sc)÷投影cno( ourse))連接 Student)
3.查詢被所有學生選修的課程號
投影cno ,sno(sc)÷投影sno( Student)
4.查詢被所有學生選修的課程號,課名
投影cno, Cname(投影Cno,sno(sc)÷投影Cno( Student)連接 Course)
5.查詢選修了95002所選全部課程的學生號碼
投影sno,cno(Sc)÷投影cno(選擇sno=95002(sc))
6.查詢選修了劉晨所選全部課程的學生號碼
投影sno,cno(sc)÷投影Cno(選擇 Sname=劉晨’(sc連接 Student))
5.綜合實例應用
圖書管理數據庫有關系模式:
圖書(書號,書名,價格,作者)
讀者(讀者號,姓名,性別,年齡)
借閱(讀者號,書號,借日期,還日期,罰款金額)
1 查詢價格大於50的書名和作者名
π 書名,作者名(σ 價格>50(圖書))
2 查詢(一次)罰款金額>20元的讀者名
π 姓名(σ 罰款金額>20(借閱 連接 讀者))
3查詢被年齡大於60的讀者借過的書名和作者名
π 作者,書名 (σ 年齡者>60 (讀者 連接 借閱 連接 圖書 ))
4 查看了所有書的讀者名
π 姓名(( π 讀者號,書號(借閱) ÷ π 書號(圖書)) 連接 讀者)
5 查看了‘張三’所看過的所有書的讀者名
π姓名( π 讀者號,書號(借閱) ÷ π書號(σ 姓名=‘張三’ (讀者 連接 借閱)) 讀者)
6 查詢沒有借過書的讀者姓名
π姓名( ( π讀者號 (讀者) - π讀者號 (借閱)) 連接 讀者)