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