关系演算

以数理逻辑中的谓词演算为基础

元组关系演算语言ALPHA

由E.F.Codd提出,以数理逻辑中的谓词演算为基础语句

检索语句(查询)GET

更新语句PUT,HOLD,UPDATE,DELETE,DROP

一、检索操作

(1) 简单检索(即不带条件的检索)(2) 限定的检索(即带条件的检索)(3) 带排序的检索(4) 带定额的检索(5) 用元组变量的检索(6) 用存在量词的检索(7) 带有多个关系的表达式的检索(8) 用全称量词的检索(9) 用两种量词的检索(10) 用蕴函(Implication)的检索

(1)简单检索

   GET 工作空间名 (表达式)

[例1]  查询所有被选修的课程号码。

GET W (SC.Cno)

[例2]  查询所有学生的数据。

GET W (Student)

(2)限定的检索

    GET 工作空间名(表达式):操作条件[例3]查询信息系(IS) 年龄小于20岁的学号和年龄。

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

(3)带排序的检索

[例4]  查询计算机科学系(CS)学生的学号、年龄,结果按年龄降序排序。

GET W (Student.Sno,Student.Sage): Student.Sdept='CS' DOWN Student.Sage

排序关键字: UP升序  DOWN降序

(4)带定额的检索

[例6]  查询信息系年龄最大的三个学生的学号及其年龄,结果按年龄降序排序。

GET W (3) (Student.Sno,Student.Sage): Student.Sdept='IS' DOWN Student.Sage

(5)用元组变量的检索

元组变量:  取值在某关系内元组的量,用于形成查询条件定义元组变量 格式:    RANGE  关系名  变量名例如:         

RANGE STUDENT X

  (6) 用存在量词的检索

[例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)

(7)带有多个关系的表达式的检索

[例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='数据库原理课')

(8)用全称量词的检索 

[例12]  查询不选1号课程的学生名字。查询语义:查询这样的学生,条件是对所有选课元组, 都不表明该生选了1号课(或者与该生学号不同, 或者课号不是1)

RANGE SC SCX

GET W (Student.Sname): 任意 SCX ( SCX.Sno≠Student.Sno ∨ SCX.Cno≠1 )

用存在量词代替全称量词

对所有的x,P为真==不存在这样的x,P不为真

(8)不用全称量词的检索

[例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)

 题型没有...,用不存在

 

(9)用两种量词的检索

[例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有关)

(9)用存在量词代替全称量词

求解思路:查询这样的学生,条件是不存在这样的课程这个学生未选

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)

(10)用蕴函(Implication)的检索

[例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))

(11)改为不用蕴函

   查询语义:   对所有的课, 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))

(12)改为不用蕴函不用全称

思路:不存在这样的课,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 ))

 

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。