学海荡舟手机网

主页 > 实用文摘 > 教育文摘_04 > > 详细内容

PB7谓词逻辑演算功能分析_信息技术论文

                pb7谓词逻辑演算功能分析

 

                 淮阴工学院 张有东

 

摘要:本文介绍了powerbuilder7.0中谓词逻辑演算功能,并举例分析了其应用。

关键词: sql、嵌套选择、谓词演算

 

    结构化查询语言sql是一种介于关系代数与关系演算之间的关系数据库语言,由于其通用性和功能强的特点,目前已成为关系数据库的标准语言。因此,各数据库厂家纷纷推出各自支持的sql软件或sql的接口软件。但是,不同dbms中对标准sql的支持程度不尽相同。从谓词逻辑功能上看,现有的微型机上的dbms一般均支持带有exists(代表存在量词)和not exists的相关查询,而sybase 公司的powerbuilder7.0 ,还支持any、all等谓词和嵌套选择(nested select),而vfp、access、paradox等dbms则不具备,这就使pb7的查询功能强大而灵活,本文给合笔者所开发的教务管理系统,就pb7中sql的谓词逻辑演算的应用作一分析,本系统中的数据库包含有以下三个表:

    ⑴“”表st(sno,sname,ssex,sage,sdept),相应属性含义分别为学号、姓名、性别、年龄和所在系。

    ⑵“课程”表course(cno,cname,cpno,ccredit),相应属性含义分别为课程号、课程名、先修课名和学分。

    ⑶“选课”表sc(sno,cno,grade), 相应属性含义分别为学号、课程号和成绩。

如查询条件为“所有选修了2号课程的成绩”的pb7的sql语句如下:

select "st"."sname" 

from "st" 

where exists (select "sc"."sno" 

              from "sc" 

              where ("sc"."cno" = '2' ) and ( "sc"."sno" = "st"."sno" ) );  

    其一般处理过程为:首先取外层查询中st表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若内层where子句返回值为真(即内层查询结果非空),则取此元组放入结果表;然后再检查st表的下一个元组,如此反复求值,直到st表全部检查完毕为至。可见,这类查询的一个显著特点是内层查询的查询条件依赖于外层父查询的某个属性值(上述语句中是依赖于st表中的sno值)。

    同时,也正是由于带exists量词的相关嵌套查询只关心内层查询是否有返回值,并不需要具体值,因此这类查询的效率有时甚至是最高效的。而ansi公布的sql92标准中却没有全称量词(for all)和蕴函(implication)逻辑演算,pb7中也没有,解决的方法是利用谓词演算将一个带有全称量词的谓词或一个逻辑蕴函的谓词转换为等价的带有存在量词的谓词,我们可很容易推导出如下的等价公式(p、q表示条件):

(1)(∨x)p≡┐(зx(┐p))

(2)p   q≡┐p∨q

    这样,就可以通过谓词演算实现系统的含有全称量词和蕴含逻辑运算的查询。

如查询条件为“至少选修了98001学生选修的全部课程的学生的号和姓名”的实现过程如下:

    设用p表示谓词“98001选修了课程y”。

    用q表示谓词“x选修了课程y”。

    用cy表示“课程y”。

    则上述查询可表示为:(∨cy)(p→q)

    该查询可以转换为如下等价形式:

    (∨cy)p→q≡┑Эcy(┑(p→q))≡┐Эcy(┒(┒p∨q))≡┒Эcy(p∧┐q)

    它所表示的语义可解释为:不存在这样的课程y,98001学生选修了y,而x没有选,用pb7的sql可表示如下:

select distinct "sc"."sno" 

from "sc", "scx" 

where (  "sc"."sno" = "scx"."sno" ) and 

      

       ((not exists ( select distinct "sc"."sno" 

                  from "sc", "scx" 

                  where (  "sc"."sno" = "scx"."sno" ) and 

                         ((“scy”. “sno”=’95002’)and

  


                         ( not exists ( select "sc"."sno" 

                           from "sc", "scy" 

                           where ( "sc"."sno" = "scy"."sno" ) and 

                          ( ( "scy"."sno" = '95002' ) and

                          ( not exists ( select "sc"."sno" 

                                 from "sc", "scz" 

                                 where ( "sc"."sno"  =  "scz"."sno" ) and

                                        ( ( "scz"."sno" =  "scx"."sno" ) and

                                         ("scz"."cno" = "scy"."cno" ))))))))

 

    需要注意的是,虽然标准的sql