首页 理论教育查询分析及其应用示例

查询分析及其应用示例

【摘要】:查询分析可以对确定无法进一步处理的规范化查询予以拒绝,拒绝的主要原因是该查询的变量类型是不正确的,或者语义是不正确的,等等。 假设有三个关系,分别是Student(学生)、COURSE(课程)和SC,我们来看下面的SQL查询:Select sname,cnof rom Student,SC,COURSEwhere Student.sno=SC.sno AND cname="CAD/CAM"AND age=23图7.1为了对应例7.2的查询图,分为两个不相连的子图。拒绝该查询,或者假设存在一个蕴含SC和COURSE的连接或笛卡儿积运算。图7.1不相连的查询图

查询分析可以对确定无法进一步处理的规范化查询予以拒绝,拒绝的主要原因是该查询的变量类型是不正确的,或者语义是不正确的,等等。一旦发现这类情况,可以简单地把查询退回给用户,并伴随一些说明;否则,继续查询处理过程。这样,对不合理或无意义的查询不必存取其实际数据,可以拒绝掉,也减少了不必要的计算开销。

如果查询中的任意一个关系属性或关系名没有在全局模式中定义过,或者操作是应用在错误类别属性上的,则该查询的类别是不正确的。因此不必实在地执行这个查询,这样,就减轻了系统的负担。例7.1是一个学校数据库中的SQL查询。

【例7.1】 学校数据库中的SQL查询。

Select Q#

f rom Student

where sname>300

例7.1的查询对象是关系Student,条件是学生的姓名(sname)大于300,输出是Q#的值。

例7.1的查询问题反映在两个方面:首先,属性Q#在模式定义中没有定义;其次,“>300”操作和sname的字符串类型不兼容。因此,这个查询不合法,无需访问这个关系的数据就可以拒绝执行这个查询。这样大大减轻了负担。

一个查询,如果它的组成成分和产生的结果毫无关系,则是语义不正确的。在关系演算中,不可能简单地确定查询语义的一般正确性,但是对于一大类特殊的关系查询来说是可能的。这种处理是基于所谓查询图的表示是否合理来做到的。

在查询图中,结构呈树状。其中一个节点表示结果关系,称为根节点;叶子节点是操作关系,中间节点是算符,边表示操作关系。

【例7.2】 假设有三个关系,分别是Student(学生)、COURSE(课程)和SC(学生选修课程),我们来看下面的SQL查询:(www.chuimin.cn)

Select sname,cno

f rom Student,SC,COURSE

where Student.sno=SC.sno AND cname="CAD/CAM"AND age=23

图7.1为了对应例7.2的查询图,分为两个不相连的子图。显然,右边的子图与希望查询的结果sname和cno的值毫无关系。这样就告诉我们,这个查询在语义上是不正确的,因为条件和结论不一致。

为此,可以考虑如下解决办法。

(1)拒绝该查询,或者

(2)假设存在一个蕴含SC和COURSE的连接或笛卡儿积运算。

图7.1 不相连的查询图