首页 > 范文大全 > 正文

WHERE EXISTS子查询应用研究

开篇:润墨网以专业的文秘视角,为您筛选了一篇WHERE EXISTS子查询应用研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要: SELECT语句作为SOL语言的核心,可以通过使用where子句实现灵活而复杂的查询操作。其中,与谓词exists所形成的嵌套查询是理解的难点,该文将通过分析查询实例,探讨如何使用WHERE EXISTS子查询实现复杂的查询操作。

关键词:数据库;SOL;EXISTS;子查询

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)13-2985-03

Research of The WHERE EXISTS Query Application

ZHANG Yan-xia, CHEN Dan-qi, HAN Ying

(Disaster Information Engineering Department, Institute of Disaster Prevention, Beijing 101601, China )

Abstract: The SELECT statement as part of the SOL language core, can be achieved by using the WHERE clause to realize flexible and complex query operation. Among them, and predicate EXISTS formed by nested query is the difficulties to understand, this paper through the analysis of query examples, discusses how to use the WHERE EXISTS query to achieve complex query operation.

Key words: database; SQL;EXISTS; subquery

1 WHERE EXISTS子句

SELECT语句作为SOL语言的核心,可以通过使用WHERE子句实现灵活而复杂的查询操作。其中,可通过使用WHERE EX? ISTS子查询实现复杂的查询操作。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。例如WHERE EXISTS嵌套查询:

SELECT * FROM TABLE1 WHERE EXISTS—外层查询或父查询

(SELECT * FROM TABLE2 WHERE条件)—内层查询或子查询

WHERE EXISTS语法:EXISTS代表存在量词‘?’,由EXISTS引出的子查询,目标列表达式通常都用*,该类子查询只返回真值或者假值,不返回任何数据。在执行查询时,首先取外层查询TABLE1中的第一个元组,如果对应内层查询非空(TABLE2中存在满足内层WHERE条件的元组),则外层查询的WHERE后面条件为真,则取出外层TABLE1中的第一个元组;否则若对应内层查询为空(TABLE2中不存在满足内层WHERE条件的元组),外层查询条件为假,则不取出该外层元组。然后再取TABLE1表中的下一个元组;重复这一过程,直到外层TABLE1表中所有行全部检查完为止。

2 WHERE EXISTS子句初步应用

WHERE EXISTS子查询作为查询操作理解的难点,现以“数据库系统概论”教材中SPJ数据库为例,通过相应查询操作,理解WHERE EXISTS子查询的执行过程及其特点。

SPJ数据库中有四张表:S,P,J,SPJ分别代表供应商表、零件表、工程表、供应情况表,四张表结构及各字段的含义如下:

S(SNO, SNAME , STATUS,CITY)—供应商编号,供应商姓名,供应商状态,所在城市

P(PNO, PNAME, COLOR,WEIGHT)—零件编号,零件名称,零件颜色,零件重量

J(JNO, JNAME, CITY)——工程编号,工程名称,工程所在城市

SPJ(SNO, PNO, JNO, QTY)——供应商编号,零件编号,工程编号,使用数量

下划线表示该字段为主键,其中SPJ表中SNO、PNO、JNO为外键,分别参照S.SNO、P.PNO和J.JNO。表中数据如图1。

解析:查询工程的名称(涉及表J),该工程满足条件:存在该工程使用了P1零件(涉及表SPJ)。SOL语句实现:

SELECT Jname

FROM J

WHERE EXISTS

(SELECT *

FROM SPJ

WHERE SPJ.Jno = J.Jno AND SPJ.Pno =’P1’)

执行过程:取出J表中的第一个记录,根据Jno值,得出J1使用了P1零件,结果非空,WHERE条件为真,则将对应的Jname值“三建”取出;然后依次取出J表的下一个记录,重复这一过程,直至外层J表中所有记录均检查完为止。

查询特点:该类子查询中查询条件依赖于父查询中的某个值,因此需反复求值,所以这类子查询又称相关子查询。

3 WHERE EXISTS子句实现复杂的查询操作

一层嵌套查询能够实现简单的查询操作,要实现复杂的查询,需要创建多层嵌套子查询。

查询2:查询使用了零件表中全部零件的工程名称

解析:找工程名称(涉及J表),该工程满足条件:对所有的零件,若该零件是零件表中的零件,则该工程使用了该零件(涉及表P, SPJ)。

利用离散数学的知识,将该条件看作一个命题。根据句意,将该查询转化为谓词表达:找工程Jx的名称,该工程满足条件:对于所有零件Py,若Py是P表中的零件,则Jx使用了该零件Py,用M(Py)表示谓词“零件Py是P表中的零件”,用P(Jx,Py)表示谓词“工程Jx使用了零件Py”则该查询可以表示为:(?Py)(M(Py)P(Jx,Py))

SOL中虽没有全称量词和逻辑蕴涵的表示,但他们都可以转换为等价的存在量词谓词表示。利用相关数理逻辑和谓词逻辑公式进行转换,推导如下:

(?Py)(M(Py)P(Jx,Py))((?Py)(M(Py)P(Jx,Py)))

((?Py)(M(Py)V(P(Jx,Py)))

((?Py)(M(Py)∧P(Jx,Py)))

(?Py)(M(Py)∧P(Jx,Py))

语义:查询工程名称,满足条件:不存在这样的零件Py,Py属于零件表P,且不存在工程JX使用了该零件Py。SOL语句实现:

SELECT Jname

FROM J

WHERE NOT EXISTS

(SELECT *

FROM P

WHERE NOT EXISTS

(SELECT *

FROM SPJ

WHERE SPJ.Jno= J.Jno AND SPJ.Pno= P.Pno))

执行过程:该查询是一个三层查询,外层循环依次扫描J表中的每个元组,中层循环依次扫描P表中的每个元组,内层循环依次扫描SPJ表中的每个元组。对于J中的每一个元组,若有一种零件没有使用,则最内层查询为空,得出中层选择条件为真,进而得出中层查询不为空,从而外层的选择条件为假,该工程元组不会被选出来。所以,只有某个工程使用了P表中的所有零件,最内层查询每次都不为空,中层选择条件每次都为假,得出中层查询结果为空,进而得出外层选择条件为真,该工程记录就被选择出来。

执行结果:

通过查询实例分析,要实现复杂的查询操作可通过以下三步完成:(l)将复杂查询进行语义分析形成命题,利用谓词表达命题(2)将命题等价为存在量词的表示(3)根据存在量词谓词书写SOL语句。我们通过查询3进一步理解该步骤。

查询3:查找供应商姓名,该供应商供应给了与供应商S1所供应的工程完全不同的工程项目

(l)解析:查找供应商Sx姓名,该供应商满足条件:对于所有工程Jy,若S1和Jy有供应关系,则Sx与Jy没有供应关系(涉及表SPJ)

谓词公式表示:

谓词P(SX,Jy)表示:供应商Sx供应了工程Jy

谓词Q(S1,Jy)表示:供应商S1供应了工程Jy

则命题的谓词表示:(?Jy)(P(S1,Jy)Q(Sx,Jy))

(2)等价表示:

(?Jy)(P(S1,Jy)Q(Sx ,Jy))((?Jy)(P(S1 ,Jy)Q(Sx,Jy)))

((?Jy)(P(S1 ,Jy)∨Q(Sx,Jy)))

((?Jy)(P(S1 ,Jy)∧Q(Sx,Jy)))

((?Jy)(P(S1 ,Jy)∧(Sx,Jy))

语义:查找这样的供应商Sx,满足条件:不存在这样的工程Jy,S1供应Jy,且Sx也供应Jy

(3)SQL语句:

SELECT Sname

FROM S

WHERE NOT EXISTS

(SELECT Jno

FROM SPJ SPJX

WHERE SPJX.sno =’S1’ AND EXISTS

(SELECT *

FROM SPJ SPJY

WHERE SPJY.sno = S.sno AND SPJY.Jno = SPJX.Jno))

4结束语

在WHERE EXISTS子查询中,首先扫描外层表,针对外层表的每一个元组,扫描内层表,再根据内层查询结果是否为空,判断外层查询条件是否成立,来决定是否取出外层元组。可依据离散数学中的数理逻辑和谓词逻辑知识,帮助我们直观的理解并掌握WHERE EXISTS子句的执行过程,从而可以自然的书写复杂的多层嵌套子查询语句,以实现复杂的查询操作。

参考文献:

[1]王珊,萨师煊.数据库系统概论[M].4版.北京:高等教育出版社,2007.

[2]赵一鸣.离散数学[M].北京:人民邮电出版社,2011.

[3]刘亭利,伍搏.详析SQL语言的WHERE子句与HAVING子句[J].怀化学院学报,2008, 27(8).

[4]杨振宇.巧用SQL的查询技术[J].软件,2011,32(4).

[5]李红日,宋俊兰.用SQL语句实现关系代数运算探讨[J].科技信息:学术研究, 2008(8).

[6]张文雯. SQL Server嵌套查询[J].科技与企业,2011(13).