“EXISTS”在SQL中的应用研究
2010-04-16肖海蓉
肖海蓉
(陕西理工学院,陕西汉中723000)
1.引言
EXISTS的使用在实际的数据库应用系统开发中有着较为广泛的应用,其在SQL的教学、实践环节中也是学生比较难于理解和掌握的内容。但是,目前在大多数的教材和参考书上只是简单地通过一两个例子介绍了带有存在量词EXISTS的书写语句,并没有给出实质性的说明。本文根据作者多年的教学经验,总结出EXISTS在不同的场合下的使用情况,并以学生接触较多的实际案例为依托,在SQL Server环境下得到了验证。
2.案例导入
以网上商品销售系统的数据库为例,对EXISTS在不同场合的使用进行探讨,下面给出了数据库中的客户表、商品表、商品销售表。
表1 商品表
表2 客户表
3.带有EXISTS的SQL语句的实例设计
我们知道,SQL语句并不提供语义中含有全称量词(For All)的实现方法,具体实现时,可以把带有全称量词的谓词转换为等价的带有存在量词(EXISTS)的谓词形式。
表3 产品销售表
3.1 语义中有“全是”的情况
例:为了统计商品销售的情况,查询全是“女”客户购买的商品编号。
问题分析:即在查找结果中的商品编号没有“男”客户购买过此商品。可以使用间接的方法,先求客户购买过的所有商品编号以及男客户购买的商品编号,两者再做差运算就可得到所求结果,这时使用SQL语句提供的组合查询minus,则设计查询语句如下:
但在SQL Server2005的环境下,分析语句后结果如图1所示。这是因为在SQLServer、MySQL在内的几种SQL产品的不同版本并不完全支持标准SQL提供的INTERSECT和MINUS两种操作。因此,我们必须寻求另外一种解决此问题的方法。可以把“全是”转换为等价的带有存在量词(EXISTS)的形式语义,其等价的语义为:查找这样的商品编号,不存在男客户也购买了此商品的情况存在。则设计的SQL语句如下:
需要注意的是:在含有“全是”语义中,不能用谓词IN来代替EXISTS,如果使用IN的话,则查询结果中会还有男女客户都购买的商品编号。当然,此类问题还可以使用=all谓词加以实现。
3.2 语义中有“全部”“、每个”或“至少包含”的情况
例:为了统计不同客户购买商品的情况,查询购买过全部商品的客户名。
问题分析:查询购买过全部商品的客户姓名,即找这样的商品名,不存在某一个商品他不购买的情况。通过等价的语义转换,同样可以把SQL语句设计成EXISTS的形式如下:
同样,此类问题的SQL查询语句也不能使用IN代替EXISTS。
3.3 语义中有否定的“没有”、“未”的情况
例:为了统计哪些商品未曾有过销售记录,求没有客户购买过的商品名。
问题分析:没有客户购买过的商品名,即找这样的商品,在商品销售表中不存在该商品有销售记录。转换为等价的带有EXISTS的SQL语句如下:
执行的结果如图4所示,由于本数据库中不存在哪个商品未销售过,所以执行结果为空。
这种类型同样能够解决诸如“查询购买了那个商品,但没有购买另一种商品”的情况。
3.4 语义中有“既…又”、“并且”和“或”的情况
例:查询购买了商品编号“s1001”,并且又购买了商品编号“s2002”的客户名。
问题分析:此类问题同样可转换为带有EXISTS的SQL语句,设计的语句如下:
其执行结果如图5所示。
4.结束语
在数据库原理课程的教学中,带有EXISTS的SQL查询语句一直以来是教学中的一个难点,也是学生最头痛的问题,文章以SQL Server2005为实现环境,通过实际的案例研究,总结出在SQL语句的设计中,如何正确灵活地使用EXISTS的情况,更好地掌握SQL语句的书写技巧。
[1]李春葆,数据库原理及应用系统解析[M].北京:清华大学出版社,2002.
[2]高荣芳等,数据库原理[M].西安:西安电子科技大学出版社,2003.
[3]苗雪兰等,数据库系统原理及应用教程[M].北京:机械工业出版社,2007.
[4]肖海蓉.SQL中分组查询的设计与应用[J].计算机与数字工程,2009,5:85-87.
[5]肖海蓉.关系代数中“除法”运算与SQL中带有exists子查询的对比教学[J].电脑学习,2009,5:158-159.