以數理邏輯中的謂詞演算爲基礎數據庫
由E.F.Codd提出,以數理邏輯中的謂詞演算爲基礎
語句spa
檢索語句(查詢)
GET3d
更新語句
PUT,HOLD,UPDATE,DELETE,DROPcode
(1) 簡單檢索(即不帶條件的檢索)
(2) 限定的檢索(即帶條件的檢索)
(3) 帶排序的檢索
(4) 帶定額的檢索
(5) 用元組變量的檢索
(6) 用存在量詞的檢索
(7) 帶有多個關係的表達式的檢索
(8) 用全稱量詞的檢索
(9) 用兩種量詞的檢索
(10) 用蘊函(Implication)的檢索
blog
GET 工做空間名 (表達式)排序
[例1] 查詢全部被選修的課程號碼。數學
GET W (SC.Cno)
[例2] 查詢全部學生的數據。io
GET W (Student)
GET 工做空間名(表達式):操做條件
[例3]查詢信息系(IS) 年齡小於20歲的學號和年齡。class
GET W (Student.Sno,Student.Sage): Student.Sdept='IS'∧student.Sage<20
[例 補充]查詢選1號課的學生名和成績基礎
GET W (Student.Sname,SC.grade): SC.CNO=1 ∧ Student.Sno=SC.Sno
[例4] 查詢計算機科學系(CS)學生的學號、年齡,結果按年齡降序排序。
GET W (Student.Sno,Student.Sage): Student.Sdept='CS' DOWN Student.Sage
排序關鍵字: UP升序 DOWN降序
[例6] 查詢信息系年齡最大的三個學生的學號及其年齡,結果按年齡降序排序。
GET W (3) (Student.Sno,Student.Sage): Student.Sdept='IS' DOWN Student.Sage
元組變量: 取值在某關係內元組的量,用於造成查詢條件
定義元組變量
格式: RANGE 關係名 變量名
例如:
RANGE STUDENT X
[例8] 查詢選修2號課程的學生名字。
RANGE SC X GET W (Student.Sname): 存在X (X.Sno=Student.Sno∧X.Cno=2)
查詢語義:查詢這樣的學生名,條件是存在選課元組X,X的學號與該生的學號相等而且X的課號爲2(代表該生選了2號課)
記住: 當查詢條件來自工做區之外的關係時, 要使用元組變量和量詞.
先定義元組變量, 在查詢條件中用量詞引入元組變量.
請對比下面兩個查詢
查詢選修2號課程的學生名字。
條件來自工做區外的關係
RANGE SC X GET W (Student.Sname):存在 X(X.Sno=Student.Sno∧X.Cno=2)
查詢選修2號課的學生名和成績
條件來自工做區內的關係
GET W (Student.Sname,SC.grade): Student.Sno=SC.Sno ∧ SC.CNO=2
[例9] 查詢選修了這樣課程的學生學號,其先行課是6號課程。
RANGE Course CX GET W (SC.Sno): 存在 CX (CX.Cno=SC.Cno∧CX.Pcno=6)
查詢CS系選修2號課程的學生名字?
RANGE SC X GET W (Student.Sname): Student.Sdept= 'CS' ∧存在 X (X.Sno=Student.Sno∧X.Cno=2)
第一個條件只用到學生表, 直接給出,第二個條件則須要元組變量和存在量詞來表示了。
[例10]查詢選修了先行課爲6號課的課程的學生名
RANGE Course CX RANGE SC SCX GET W (Student.Sname):存在 SCX(SCX.Sno=Student.Sno ∧ 存在 CX(CX.Cno=SCX.Cno∧CX.Pcno=6))
改成前束範式形式:
RANGE Course CX RANGE SC SCX 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.Sno=Student.Sno ∧ Course.Cno=SCX.Cno ∧ SCX.Grade≥90)
查詢CS系的學生名
GET W(STUDENT.SNAME):STUDENT.SDEPT='CS'
查詢選1號課的學號,成績
GET W(SC.SNO, SC.GRADE):SC.CNO=1
查詢先行課爲6的課名
GET W(COURSE.CNAME):COURSE.CPNO=6
查詢選過課的學生名
RANGE SC X
GET W(Student.Sname): 存在 X (X.Sno=Student.Sno)
查詢選1號課的學生名
RANGE SC X GET W(Student.Sname): 存在 X (X.Sno=Student.Sno∧X.Cno=1)
查詢CS系選1號課的學生名
RANGE SC X GET W(Student.Sname): Student.Sdept='CS' ∧ 存在 X (X.Sno=Student.Sno∧X.Cno=1)
查詢被選過的課名
RANGE SC X
GET W(Course.Cname): 存在 X(X.Cno=Course.Cno)
查詢學號爲95001學生選的課名
RANGE SC X GET W(Course.Cname):存在 X (X.Cno=Course.Cno∧X.Sno=95001)
查詢CS系學生的課號,成績
RANGE Student X GET W(SC.Cno, SC.Grade):存在 X (X.Sno=SC.Sno ∧ X.Sdept='CS')
查詢選修數據庫原理課的學號,成績
RANGE Course X GET W(SC.Sno, SC.Grade):存在 X (X.Cno=SC.Cno∧X.Cname='數據庫原理')
查詢CS系選修數據庫原理課的學生姓名
RANGE SC SCX RANGE Course CX GET W(Student.Sname): Student.Sdept='CS' ∧ 存在 SCX 存在 CX (SCX.Sno=Student.Sno ∧ CX.Cno=SCX.Cno ∧ CX.Cname='數據庫原理課')
[例12] 查詢不選1號課程的學生名字。查詢語義:查詢這樣的學生,條件是對全部選課元組, 都不代表該生選了1號課(或者與該生學號不一樣, 或者課號不是1)
RANGE SC SCX GET W (Student.Sname): 任意 SCX ( SCX.Sno≠Student.Sno ∨ SCX.Cno≠1 )
用存在量詞代替全稱量詞
對全部的x,P爲真==不存在這樣的x,P不爲真
[例12] 查詢不選1號課程的學生名。
查詢語義:查詢這樣的學生,條件是不存在選課元組,學號與該生學號相同而且課號是1 (代表該生選了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 )
查詢選過課的學生名
RANGE SC X
GET W(Student.Sname): 存在 X (X.Sno=Student.Sno)
查詢選1號課的學生名
RANGE SC X GET W(Student.Sname): 存在 X (X.Sno=Student.Sno∧X.Cno=1)
查詢CS系選1號課的學生名
RANGE SC X GET W(Student.Sname): Student.Sdept='CS' ∧ 存在 X (X.Sno=Student.Sno∧X.Cno=1)
查詢沒有選過課的學生名
RANGE SC X
GET W(Student.Sname): 不存在 X (X.Sno=Student.Sno)
查詢沒有選1號課的學生名
RANGE SC X GET W(Student.Sname): 不存在 X (X.Sno=Student.Sno∧X.Cno=1)
查詢CS系沒有選1號課的學生名
RANGE SC X GET W(Student.Sname): Student.Sdept='CS' ∧ 不存在 X (X.Sno=Student.Sno∧X.Cno=1)
題型沒有...,用不存在
[例13] 查詢選修了所有課程的學生姓名。
求解思路:對於STUDENT中的一個學生,
若是對全部的課程元組CX,都存在着SC的元組SCX,代表這個學生選修了CX, 則這個學生屬於查詢範圍。
RANGE Course CX SC SCX GET W(Student.Sname): 任意 CX 存在 SCX(SCX.Sno=Student.Sno ∧ SCX.Cno=CX.Cno)
短語:STUDENT選修了CX課
存在SCX(SCX.Sno=STUDENT.Sno ∧ SCX.Cno=CX.Cno)
存在選課元組(選課元組與STUDENT和CX有關)
求解思路:查詢這樣的學生,條件是不存在這樣的課程這個學生未選
RANGE Course CX SC SCX GET W(Student.Sname): 不存在 CX 不存在 SCX(SCX.Sno=Student.Sno ∧ SCX.Cno=CX.Cno)
短語:STUDENT選修了CX課
存在 SCX(SCX.Sno=STUDENT.Sno ∧ SCX.Cno=CX.Cno)
短語:STUDENT未選修CX課
不存在 SCX(SCX.Sno=STUDENT.Sno ∧ SCX.Cno=CX.Cno)
[例14] 查詢選修了95002學生所選課程的學生學號。
查詢語義:查詢這樣的學生,條件是對全部課程,若是95002選了,則該學生也選修了該課
RANGE Course CX SC SCX SC SCY GET W (Student.Sno): 任意 CX( 存在 SCX (SCX.Sno=95002∧SCX.Cno=CX.Cno) =》存在 SCY(SCY.Sno=Student.Sno∧ SCY.Cno= CX.Cno))
查詢語義:
對全部的課, 95002不選或者該學生選了。
RANGE Couse CX SC SCX SC SCY GET W (Student.Sno): 任意 CX( 不存在 SCX(SCX.Sno='95002'∧SCX.Cno=CX.Cno) 或者 存在 SCY(SCY.Sno=Student.Sno ∧ SCY.Cno= CX.Cno))
思路:不存在這樣的課,95002選了而且這個學生未選
RANGE Couse CX SC SCX SC SCY GET W (Student.Sno): 不存在 CX(存在 SCX (SCX.Sno=95002∧SCX.Cno=CX.Cno) ∧ 不存在 SCY(SCY.Sno=Student.Sno ∧ SCY.Cno= CX.Cno))
使用離散數學的證實過程:
圖書管理數據庫有關係模式:
圖書(書號,書名,價格,做者)
讀者(讀者號,姓名,性別,年齡)
借閱(讀者號,書號,借日期,還日期,罰款金額)
用元組關係演算查詢:
1 查詢價格大於50的書名和做者名
2 查詢(一次)罰款金額>20元的讀者名
3 查詢被年齡大於60的讀者借過的書名和做者名
4 查詢看了全部書的讀者名
5 查看了2001號讀者所看過的全部書的讀者號
6 查詢沒有借過書的讀者姓名
1 查詢價格大於50的書名和做者名
GET W(圖書.書名, 圖書.做者): 圖書.價格>50
關係代數?
π 書名,做者名(σ 價格>50(圖書))
2 查詢(一次)罰款金額>20元的讀者名
查詢語義:查詢這樣的讀者,條件是存在借閱元組代表該讀者的罰款金額>20)
RANGE 借閱 借閱X GET W(讀者.姓名): 存在 借閱X (借閱X.讀者號=讀者.讀者號 而且 借閱X.罰款金額>20)
關係代數?
π 姓名(σ 罰款金額>20(借閱 鏈接 讀者))
3查詢被年齡大於60的讀者借過的書名和做者名
查詢語義:查詢這樣的圖書,條件是存在借閱元組和讀者元組,代表該圖書被年齡大於60的讀者借過
RANGE 讀者 讀者X RANGE 借閱 借閱X GET W(圖書.書名, 圖書.做者): 存在 借閱X 存在 讀者X (借閱X.圖書號=圖書.圖書號 而且 借閱X.讀者號=讀者X.讀者號 而且 讀者X.年齡>60)
關係代數?
π 做者,書名 (σ 年齡者>60 (讀者 鏈接 借閱 鏈接 圖書 ))
4 查詢看了全部書的讀者名
(用不存在量詞)
查詢語義:查詢這樣的讀者,條件是不存在這樣的圖書,該讀者未看
RANGE 圖書 圖書X
借閱 借閱X
GET W(讀者.姓名): 不存在 圖書X (不存在 借閱X(借閱X.讀者號=讀者.讀者號 而且 借閱X.圖書號=圖書X.圖書號 ) )
關係代數?
π 姓名(( π 讀者號,書號(借閱) ÷ π 書號(圖書)) 鏈接 讀者)
5查看了2001號讀者所看過的全部書的讀者名
查詢語義: 查詢這樣的讀者姓名,條件是對全部的圖書, 若是存在借閱X 元組代表2001號讀者借, 則存在借閱Y元組代表該讀者也借
RANGE 圖書 圖書X RANGE 借閱 借閱X RANGE 借閱 借閱Y GET W(讀者.姓名): 任意 圖書X(存在 借閱X(借閱X.圖書號=圖書X.圖書號 而且 借閱X.讀者號=‘2001’ ) =》
存在 借閱Y(借閱Y.讀者號=讀者.讀者號 而且 借閱Y.圖書號=圖書X.圖書號 ))
上題不用全稱和蘊涵實現
查詢語義: 查詢這樣的讀者姓名,條件是不存在這樣的圖書, 2001借而且該讀者不借(存在借閱X 元組代表2001號讀者借而且不存在借閱Y元組代表該讀者借)
RANGE 圖書 圖書X RANGE 借閱 借閱X RANGE 借閱 借閱Y GET W(讀者.姓名): 不存在 圖書X(存在 借閱X(借閱X.圖書號=圖書X.圖書號 而且 借閱X.讀者號=‘2001’ )
不存在 借閱Y(借閱Y.讀者號=讀者.讀者號 而且 借閱Y.圖書號=圖書X.圖書號 ))
關係代數?
π 讀者號,書號(借閱) ÷ π書號(σ 讀者號=2001 (讀者 鏈接 借閱))
6 查詢沒有借過書的讀者姓名
解題思路: 查詢讀者名, 條件是不存在這樣的借閱X,借閱X的讀者號與該讀者的讀者號相等
GET W(讀者.姓名): 不存在 借閱X(借閱X.讀者號=讀者.讀者號)
關係代數?
π姓名( ( π讀者號 (讀者) - π讀者號 (借閱)) 鏈接 讀者)
供應商-零件-工程-供應數據庫關係模式
S(SNO,SNAME,STATUS,CITY);
P(PNO,PNAME,COLOR,WEIGHT);
J(JNO,JNAME,CITY);
SPJ(SNO,PNO,JNO,QTY);
(1)求供應工程J1的供應商號
關係代數:
投影 SNO(選擇 JNO=‘J1’(SPJ))
關係演算:
GET W (SPJ.SNO):SPJ.JNO=‘J1’
2)求供應工程J1零件P1的供應商號
關係代數:
投影 SNO(選擇 JNO=‘J1’ 而且 PNO=‘P1’(SPJ))
關係演算:
GET W (SPJ.SNO):SPJ.JNO=‘J1’ 而且 SPJ.PNO=‘P1’
(3)求供應工程J1零件爲紅色的供應商號SNO
關係代數:
GET W (SPJ.SNO):SPJ.JNO=‘J1’而且 SPJ.PNO=‘P1’
關係演算:
RANGE P PX
GET W(SPJ.SNO): SPJ.JNO=‘J1’ 而且 存在 PX(PX.PNO=SPJ.PNO 而且 PX.COLOR=‘紅’)
(4)求沒有使用天津供應商生產的紅色零件的工程號JNO
關係代數:
投影 JNO(J)-投影 JNO(選擇 CITY=‘天津’ 而且 COLOR=‘紅’(S 鏈接 SPJ 鏈接 P))
關係演算:
從J中查詢這樣的JNO, 條件是不存在這樣的供應元組SPJX代表該工程使用了天津生產的紅色零件
GET W(J.JNO): 不存在 SPJX( SPJX.JNO=J.JNO ∧ 存在 SX(SX.SNO=SPJX.SNO∧ SX.CITY=‘天津’) ∧ 存在 PX(PX.PNO=SPJX.PNO ∧ PX.COLOR=‘紅’))
(5)求至少用了供應商S1供應的全部零件的工程號JNO
關係代數:
投影 JNO,PNO(SPJ) 除 投影 PNO (選擇 SNO=‘S1’(SPJ))
從J中查詢這樣的工程號,條件是: 不存在這樣的零件元組PX, S1供應而該工程不用
GET W(J.JNO): 不存在 PX( 存在 SPJX(SPJX.PNO=PX.PNO ∧ SPJX.SNO=‘S1’) ∧ 不存在 SPJY(SPJY.PNO=PX.PNO ∧ SPJY.JNO=J.JNO ))
(6) 查詢使用了所有零件的工程號JNO
關係代數:
投影JNO,PNO(SPJ) 除 投影 PNO (SPJ)
關係演算:
從J中查詢這樣的工程號,條件是:不存在這樣的零件元組PX, 該工程不用
GET W(J.JNO): 不存在 PX( 不存在 SPJY(SPJY.PNO=PX.PNO ∧ SPJY.JNO=J.JNO ))