SQL Server数据库技术(58)

SQL Server数据库技术(58) - 应用软件 - 电脑教程网

SQL Server数据库技术(58)

日期:2006-07-06   荐:
数据库是为更方便有效地管理信息而存在的人们,希望数据库可以随时提供所需要的数据信息。因此,对用户来说,数据查询是数据库最重要的功能。本章将讲述数据查询的实现方法。在数据库中,数据查询是通过SELECT 语句来完成的。SELECT 语句可以从数据库中按用户要求检索数据,并将查询结果以表格的形式返回。我们在“Transact-SQL 语言”章节及前面的章节中已经初步接触到了SELECT 语句的一些用法,在本章中将分类讲述其具体用法。本节讲述SELECT 语句完整的语法结构,这是一个非常冗长、枯燥的过程。读者可以跳过本节,从第二节开始阅读,而将本节作为理解、编写查询语句的语法参考资料。 SELECT 语句完整的语法结构如下:SELECT statement ::=[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } [,...n] ][ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (expression) } [,...n][ BY expression [,...n] ] ][ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }[ , XMLDATA ][ , ELEMENTS ][ , BINARY base64 ] }[ OPTION ( [,...n]) ]::={ | () }[UNION [ALL] ::= { LOOP | HASH | MERGE | REMOTE }其中LOOP | HASH | MERGE 选项指定查询优化器中的连接是循环、散列或合并的。REMOTE 选项指定连接操作由右边的表完成。当左表的数据行少于右表,才能使用REMOTE 选项。当左表和右表都是本地表时,此选项不必使用。 JOIN指明特定的表或视图将要被连接。 ON 指定连接的条件。 CROSS JOIN返回两个表交叉查询的结果。10.1.4 WHERE 子句WHERE 子句指定数据检索的条件,以限制返回的数据行。其语法如下:WHERE | ::=column_name { *= | =* } column_name各参数说明如下:search_condition通过由谓词构成的条件来限制返回的查询结果。old_outer_join指定一个外连接。此选项是不标准的,但使用方便。它用“*=” 操作符表示左连接,用“=*” 操作符表示右连接。此选项与在FROM 子句中指定外连接都是可行的方法,但二者只能择其一。注意:如果在WHERE子句中指定一个值为FALSE的条件,则可以用SELECT...INTO语句来创建一个表名不同,但结构和数据类型均和原表相同的表。10.1.5 GROUP BY 子句GROUP BY 子句指定查询结果的分组条件。其语法如下;GROUP BY [ALL] group_by_expression [,...n][ WITH { CUBE | ROLLUP } ]各参数说明如下:

ALL 返回所有可能的查询结果组合,即使此组合中没有任何满足WHERE 子句的数据。分组的统计列如果不满足查询条件,则将由NULL 值构成其数据。ALL 选项不能与CUBE或ROLLUP 选项同时使用。GROUP BY ALL is not supported in queries that access remote tables. group_by_expression指明分组条件。group_by_expression 通常是一个列名,但不能是列的别名。数据类型为TEXT、 NTEXT、 IMAGE 或BIT 类型的列不能作为分组条件。 CUBE除了返回由GROUP BY 子句指定的列外,还返回按组统计的行。返回的结果先按分组的第一个条件列排序显示,再按第二个条件列排序显示以此类推。统计行包括了GROUPBY 子句指定的列的各种组合的数据统计。 ROLLUP与CUBE 不同的是,此选项对GROUP BY 子句中的列顺序敏感,它只返回第一个分组条件指定的列的统计行。改变列的顺序会使返回的结果的行数发生变化。 使用Distinct选项的统计函数,如AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、和SUM(DISTINCT column_name)等,不能在使用CUBE或ROLLUP选项时使用。10.1.6 HAVING 子句HAVING 子句指定分组搜索条件。HAVING 子句通常与GROUP BY 子句一起使用。TEXT、 NTEXT 和IMAGE 数据类型不能用于HAVING 子句。其语法如下:HAVING HAVING 子句与WHERE 子句很相似,其区别在于其作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。10.1.7 UNION 操作符UNION 操作符将两个或两个以上的查询结果合并为一个结果集。它与使用连接查询合并两个表的列是不同的。使用UNION 操作符合并查询结果需要遵循两个基本规则:

列的数目和顺序在所有查询中必须是一致的; 数据类型必须兼容。其语法如下:| ()UNION [ALL] 10.1.10 FOR BROWSE 子句FOR BROWSE 子句用于读取另外的用户正在进行添加、删除或更新记录的表。其语法如下:FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }[ , XMLDATA ][ , ELEMENTS ][ , BINARY base64 ]}各参数说明如下:BROWSEBROWSE 选项指明当查看在使用DB-Library 的客户机应用程序中的数据时,可以更新数据。使用此子句时对所操作的表有一些限制:表必须包含一个timestamp 类型的时间标识列;表必须有一个惟一索引。注意:在SELECT语句中:FOR BROWSE子句必须是SELECT语句的最后子句;FOR BROWSE子句不能与UNION操作符同时使用;FOR BROWSE子句不能与表提示HOLDLOCK选项同时使用。

XMLXML 选项指明查询结果以XML 文档模式返回XML。 模式分为RAW、 AUTO、 EXPLICIT 三种。 RAW将查询结果每一行转换为以一个普通标识符作为元素标识XML 文档。 AUTO以简单嵌套的XML 树方式返回查询结果。 EXPLICIT指定查询结果的XML 树的形式被明确定义的。 XMLDATA返回概要信息。它是附加在文档上返回的。 ELEMENTS指明列将以子元素的方式返回。 BINARY base 64指定查询返回的以base64 格式编码的二进制数据。 10.1.11 OPTION 子句OPTION 子句用于指定在整个查询过程中的查询提示(Query Hint)。通常,用户不必使用OPTION 子句,因为查询优化器会自动选择一个最佳的查询计划。OPTION 子句必须由最外层的主查询来指定。各查询提示之间应使用逗号隔开。其语法如下: OPTION ( [,...n] )::={ { HASH | ORDER } GROUP| { CONCAT | HASH | MERGE } UNION| { LOOP | MERGE | HASH } JOIN| FAST number_rows| FORCE ORDER| MAXDOP number| ROBUST PLAN| KEEP PLAN| KEEPFIXED PLAN| EXPAND VIEWS}各参数说明如下: {HASH | ORDER} GROUP指定在GROUP BY 或COMPUTE 子句中指定的查询使用散列法或排序法。所谓散列法是指为存储和检索数据项或数据,把搜索关键字转换为一个地址的一种方法。该方法常作为数据集内的记录的一种算法,可以使记录分组均匀,减少搜索时间。 {MERGE | HASH | CONCAT} UNION指定所有的UNION 操作符采用合并(Merge)、散列(Hash) 或连接(Concatenate)的方法执行操作。如果指定了多个UNION 提示,查询优化器会挑选一个最佳的提示方案。 {LOOP | MERGE | HASH |} JOIN指定查询过程中的所有连接操作采取循环连接(Loop Join)、合并连接(Merge Join)或散列连接(Hash Join) 的方法。如果指定了多个JOIN 提示,查询优化器会挑选一个最佳的提示方案。 FAST number_rows指定查询优化只用于迅速返回前number_rows 行数据,在number_rows 行以后的数据采用原查询方法。 FORCE ORDER指定在查询语法中说明的连接顺序在查询优化的过程中保持不变。 MAXDOP number忽略由Sp_configure 设定的针对查询的最大并行线程数目。 ROBUST PLAN强制查询优化器尝试使用最大行容量的计划。 KEEP PLAN强制查询优化器放松重新编译查询的阈值。指定此选项可以让一个表被多次更新而不必频繁地重新编译查询。 KEEPFIXED PLAN强制查询优化器不重新编译查询。这样只有当表的概要改变或执行Sp_recompile 存储过程时,才会重新编译查询。 EXPAND VIEWS扩展索引化视图(当一个视图的名称在查询文本中被视图定义替换时称这个视图被扩展了),并且查询优化器不再将索引化视图作为查询的某部分的替代品。如果视图使用了WITH (NOEXPAND) 说明,则不能被扩展。 注意:SELECT语句中各子句的排列次序是很重要的,子句必须依相应的次序来使用。 当用SELECT命令读取TEXT和IMAGE类型数据时,一次所能读取的数据受限于@@TE-XTSIZE全局变量的值。 可以用SET TEXTSIZE命令来更改它。@@TEXTSIZE的初始值为4K,最大为231-1(2,147,483,647)个字节。

标签: