数据库复杂查询的教学

点赞:4861 浏览:17536 近期更新时间:2024-02-21 作者:网友分享原创网站原创

摘 要:数据库教学中的复杂查询一向是教学中的一个难点,这里将结合SQLSERVER的从多个方面对其进行讨论和总结,并对查询性能改善提出建议.

关 键 词:数据库;复杂查询;SQLSERVER

中图分类号:TP311文献标识码:A文章编号:1009-3044(2013)32-7176-02

数据库教学中的复杂查询包括嵌套子查询、关联子查询、派生表、使用EXISTS运算符以及优化查询性能等相关问题.

1子查询

子查询是嵌套在另一个查询中的T-SQL查询,子查询可以用来将一个复杂查询分解为几个简单步骤,为WHERE子句和[IN|EXISTS|ANY|ALL]提供一个目标列表,为父查询中记录提供一个查询表.

有些子查询容易得到和创建,有些就比较复杂,其复杂程度取决于内部查询与外部查询之间关系的复杂度,另外,大部分子查询均可以用关系连接来替换,但子查询的系统开销更小.

2嵌套子查询

嵌套子查询返回在外部查询中使用的单个值,或者与IN运算符一起使用,在使用“等于”运算符时,将使用一个返回单个值的查询,若使用IN运算符,将返回一个值列表,例如:

SELECT

FROM

WHERE等于(

SELECT

FROM

WHERE

或者

SELECT

FROM

WHEREIN(

SELECT

FROM

WHERE

在大部分情况下SQLSERVER会将嵌套子查询方法解析为和使用连接一样的查询计划,但当查询计划不同时,连接更高效.

3关联子查询

与嵌套子查询不同,其信息传递是双向的,嵌套子查询中,内部查询只处理了一次,然后将信息传递到外部查询,而外部查询也只执行一次,而在关联子查询中,内部查询用外部查询提供的信息运行这一过程分三步走.

1)外部查询获得一个记录,然后将该记录传递到内部查询.

2)内部查询根据传递的值执行

3)内部查询将结果值传回外部查询,外部查询利用这些值完成处理过程

以AdventureWorks2008数据库为例,若讨论查看第一天放置到系统中的订单的查询,并且需要知道客户第一天下订单的日期和订单ID.如果用两个单独的查询来完成,只需创建一个临时表,在与之连接.如果希望在一个查询中进行那么需要好到一种方法来查看每个客户.可以让内部查询基于当前外部查询的CustomerID来执行查找.然后将返回值传递给外部查询,这样可基于最早的订单日期进行匹配.

代码如下:

SELECTOD1.CUSTOMERID,OD1.SALESORDERID,OD1.ORDERDATE

FROMSALES.SALESORDERHEADEROD1

WHEREOD1.ORDERDATE等于(SELECTMIN(OD2.ORDERDATE)

FROMSALES.SALESORDERHEADEROD2

WHEREOD2.CUSTOMERID等于OD1.CUSTOMERID)

ORDERBYCUSTOMERID;

在查询中要注意,是否使用别名由自己决定,但对于关联子查询通常是需要的,既然两个查询都需要从对方获取信息,如果没有别名,就无法知道需要的数据来自那个表.

4派生表

有时,对于给定表的每个行,可能在子查询中有多个结果,但需要比IN运算符提供更复杂操作,这种情况下需要在子查询中使用JOIN运算符.

数据库复杂查询的教学参考属性评定
有关论文范文主题研究: 关于数据库的论文范文 大学生适用: 高校大学论文、学位论文
相关参考文献下载数量: 55 写作解决问题: 本科论文怎么写
毕业论文开题报告: 论文模板、论文小结 职称论文适用: 职称评定、中级职称
所属大学生专业类别: 本科论文怎么写 论文题目推荐度: 经典题目

派生表由一个查询结果集的列和行组成,将生成结果集的查询用小括号括起来,给查询结果其别名,使其可作为表被引用,语法如下:

SELECT

FROM()AS

JOIN

注意,派生表不是万能的,如果结果集很大,并得到大量连接记录,则可能要使用临时表并在上面建立索引(派生表没有索引).

5EXISTS运算符

使用EXISTS运算符,并不真正返回数据,而是根据是否存在数据满足EXISTS子句建立的查询条件,返回TRUE或者FALSE,当然,基于连接的语法也能得到相同的结果,但性能差异较大.


当使用EXISTS语句时,SQLSERVER不需要执行一行一行的连接,而是找记录,直到找到第一个匹配的记录就停止.

EXISTS通常用法是运行CREATE语句前检测表是否已创建,通常EXISTS的性能比派生表的性能要好.

6查询性能

一般说来,要尽可能使用连接代替子查询,但有时,部分因素会影响该观点,比如:两个表都相对较小时(不超过10000个记录),根据所有条件,匹配只返回很少的值,在查找列上没有索引,查找表相对很小,但基表很大时,子查询性能较好.

7结束语

通常简单查询组以应对日常所需,但仍会有一小部分较难,有时问题在于能否找到所需查询,有时则是某个特定查询性能稽查,总会遇到简单查询和连接无法解决的问题,这时就要用到以上所述内容.