以数理逻辑中的谓词演算为基础
由E.F.Codd提出,以数理逻辑中的谓词演算为基础
语句
检索语句(查询)
GET
更新语句
PUT,HOLD,UPDATE,DELETE,DROP
(1) 简单检索(即不带条件的检索)
(2) 限定的检索(即带条件的检索)
(3) 带排序的检索
(4) 带定额的检索
(5) 用元组变量的检索
(6) 用存在量词的检索
(7) 带有多个关系的表达式的检索
(8) 用全称量词的检索
(9) 用两种量词的检索
(10) 用蕴函(Implication)的检索
GET 工作空间名 (表达式)
[例1] 查询所有被选修的课程号码。
GET W (SC.Cno)
[例2] 查询所有学生的数据。
GET W (Student)
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
[例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不为真
原文:https://www.cnblogs.com/wkfvawl/p/11031826.html