第31卷第2期 唐山师范学院学报 2009年3月 Vol. 31 No. 2 Journal of Tangshan Teachers College Mar. 2009
数据库中相关子查询的实现初探
李春艳,高 伟
(唐山师范学院 计算机科学系,河北 唐山 063000)
摘 要:在使用关系数据库时,用户需要的数据经常散步在多个表中,可以使用相关子查询获得所需数据。说明了相关子查询的一种执行过程。给带蕴涵语义查询功能的实现和执行提供了一些参考。
关键词:相关子查询 实现 执行 中图分类号: TP311.13
文献标识码:A
文章编号:1009-9115(2009)02-0105-02
Implementation of Correlated Sub-query in the Database
LI Chun-yan, GAO Wei
(Department of Computer Science, Tangshan Teachers College, Tangshan Hebei 063000, China)
Abstract: The data we needed is always scattered in several tables when using relational database and we had better access to data with correlated sub-query. It needs repeated the execution between inner query and outer query. A kind of process is stated in the essay for correlated sub-query and a consultation is provided.
Key words: correlated sub-query; implementation; execution
在数据库的使用过程中,经常要遇到使用相关子查询获允许引用先前提到的任何表的子查询称为取相关表中的数据。
相关子查询,也可说该子查询具有对主查询中表的相关引用。与经典子查询不同,相关子查询依赖于外部查询。外部查询和子查询是有联系的,尤其在子查询的WHERE语句中更是如此。相关子查询的工作方式是:在子查询中找到外部查询的参考时执行外部查询,此时将结果返回给子查询。然后在外部查询返回的结果集上执行子查询操作。
相关子查询的一个主要优点在于,它能完成传统SQL Sever查询不能解决的问题。例如,使用相关子查询可以轻易完成这样的任务:带有蕴涵语义的查询。
1 实现的语句
如表1,查询至少选修了学生95002的全部课程的学生号码,实现该功能的SQL语句为:
SELECT DISTINCT Sno FROM SC SCX WHERE NOT EXISTS (SELECT * FROM SC SCY
WHERE SCY.Sno=’95002’ AND NOT EXITS
(SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno
and SCZ.Cno=SCY.Cno))
因为查询的最后结果中学生号码可能有重复值,且只显示学生号码,所以要去掉重复值。
表1 SCX(SCY,SCZ)
Sno(学号) Cno(课程号) Grade(成绩)
95001 1 92 95001 2 85 95001 3 88 95002 2 90 95002 3 80 2 使用别名区分在不同子查询中对同一表的使用 因为这是两个关系之间进行除的运算,如果只用一个关系名,则不能表示它们之间的连接关系及蕴涵运算,所以要用到别名。因为这个命令中有两个EXISTS语句,而每个语句中查询的表都是同一个表,需要用别名,所以要用到三个别名。
3 查询过程
查询过程如表2所示。
许多查询都可以通过执行一次子查询并将得到的值代
──────────
收稿日期:2008-12-18
作者简介:李春艳(1974-),女,河北遵化人,唐山师范学院计算机系讲师,研究方向为数据库。 -105-
第31卷第2期 唐山师范学院学报 2009年3月
入外部查询的 WHERE 子句中进行计算。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。
由于相关子查询中的子查询在外部查询返回的结果集上进行执行,其效率肯定下降。子查询的性能完全依赖于查询和有关的数据。但是,如果相关子查询的语句写得很有效率,则其执行性能能够胜过那些使用几个连接和临时表的程序。
表2 查询过程
最外层查询(SCX)
第2层(SCY)查询
内层查询(SCZ)
SCZ.Sno=SCX.Sno
SCZ.Cno=SCY.CNO
结果
第2层结果 SCY.Sno=’95002’ AND NOT EXISTS…
最外层结果 NOT EXISTS
SCX.Sno SCY.Sno SCY.Cno SCZ.Sno SCZ.Cno
95001 1 因第2层结果为F,不再做最内层循环 95001 2 因第2层结果为F,不再做最内层循环 95001 3 因第2层结果为F,不再做最内层循环
95001 1
95001 第1元组
95002 2 95001 2
95001 1
95001 2
95002 3
95001 2
95001 第2元组 95001 第3元组
T T T T T
F F F
F
F FT T
F FF FT T
F
T
因为得到T,最内层不再向下查询
因为得到T,最内层不再向下查询
因为与第1元组的Sno相同,而不再查询
因为与第2元组的Sno相同,而不再查询
95001 1 因第2层结果为F,不再做最内层循环 95001 2 因第2层结果为F,不再做最内层循环 95001 3 因第2层结果为F,不再做最内层循环
95001 1 95001 2
95002 2 95001 3
95002 2 95001 1 95001 2
95002 3 95001 3
95002 2 95002 3
F F F T F F F F T
F F F
F FT FF FT T
F FF FT FF TT T
F F
T
95002 第4元组
因为得到T,最内层不再向下查询
95003 第5元组
因为与第4元组的Sno相同,而不再查询
[2] 杨冬青,译.数据库系统概念[M].北京:机械工业出版社,
2000.
[3] 周傲英,译.数据库原理、编程与性能[M].北京:机械工业
出版社,2002.
[参考文献]
[1] 萨师煊.数据库系统概论[M].北京:高等教育出版社,
2000.
(责任编辑、校对:田敬军)
-106-
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务