从数据库中检索信息。
[ WITH temporary-views ] SELECT [ ALL | DISTINCT ] [ row-limitation-option-1 ] select-list [ INTO { hostvar-list | variable-list | table-name } ] [ INTO LOCAL TEMPORARY TABLE { table-name } ] [ FROM from-expression ] [ WHERE search-condition ] [ GROUP BY group-by-expression ] [ HAVING search-condition ] [ WINDOW window-expression ] [ ORDER BY { expression | integer } [ ASC | DESC ], ... ] [ FOR READ ONLY | for-update-clause ] [ FOR XML xml-mode ] [ row-limitation-option-2 ] [ OPTION( query-hint, ... ) ]
temporary-views :
regular-view, ...
| RECURSIVE { regular-view | recursive-view }, ...
regular-view : view-name [ ( column-name, ... ) ] AS ( subquery )
recursive-view : view-name ( column-name, ... ) AS ( initial-subquery UNION ALL recursive-subquery )
row-limitation-option-1 : FIRST | TOP { ALL | limit-expression } [ START AT startat-expression ]
row-limitation-option-2 : LIMIT { [ offset-expression, ] limit-expression | limit-expression OFFSET offset-expression }
limit-expression : simple-expression
startat-expression : simple-expression
offset-expression : simple-expression
simple-expression : integer | variable | ( simple-expression ) | ( simple-expression { + | - | * } simple-expression )
select-list : expression [ [ AS ] alias-name ], ... | * | window-function OVER { window-name | window-spec } [ [ AS ] alias-name ] | sequence-expression
sequence-expression sequence-name [ CURRVAL | NEXTVAL ] FROM table-name
sequence-expression:请参见表达式。
from-expression:请参见FROM 子句。
group-by-expression:请参见GROUP BY 子句。
search-condition:请参见搜索条件。
window-name : identifier
window-expression:请参见WINDOW 子句。
window-spec:请参见WINDOW 子句。
window-function : RANK( ) | DENSE_RANK( ) | PERCENT_RANK( ) | CUME_DIST( ) | ROW_NUMBER( ) | aggregate-function
for-update-clause FOR UPDATE | FOR UPDATE cursor-concurrency | FOR UPDATE OF [ ( column-name, ... ) ]
cursor-concurrency : BY { VALUES | TIMESTAMP | LOCK }
xml-mode : RAW [ , ELEMENTS ] | AUTO [ , ELEMENTS ] | EXPLICIT
query-hint : MATERIALIZED VIEW OPTIMIZATION option-value | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | option-name=option-value
option-name : identifier
option-value:hostvar(允许指示符)| string | identifier | number
WITH 或 WITH RECURSIVE 子句 定义一个或多个公用表表达式(也称为临时视图),用于该语句的其余部分。这些表达式可以是非递归的,也可以是自递归的。只要指定了 RECURSIVE 关键字,递归公用表表达式就可以单独显示,或与非递归表表达式混杂显示。不支持相互递归公用表表达式。
只有 SELECT 查询块出现在下列位置之一时,才允许使用该子句:
在包括视图定义的顶级 SELECT 查询块的顶级 SELECT 查询块内
在 INSERT 查询块内的顶级 SELECT 语句中
在任何类型的 SQL 语句中用于定义派生表的嵌套 SELECT 查询块内
递归表达式由一个初始子查询和一个递归子查询组成。初始查询隐式定义视图的模式。递归子查询必须在 FROM 子句中包含对视图的引用。每次迭代中,该引用只能引用以前迭代中添加到视图的行。该引用不能出现在外连接的空值提供方中。递归公用表表达式不得使用集合函数,而且不得包含 GROUP BY、ORDER BY 或 DISTINCT 子句。
不支持将 WITH 子句用于远程表。WITH 子句也可用于 INTERSECT、UNION 和 EXCEPT 查询块。
ALL 或 DISTINCT 子句 All(缺省值)返回满足 SELECT 语句的子句的所有行。如果指定 DISTINCT,则会消除重复的输出行。当指定 DISTINCT 时,很多语句的执行时间显著延长,因此只有在必要时才应使用 DISTINCT。
row-limitation 子句 行限制子句允许您只返回满足 WHERE 子句的行的子集。每次只能指定一个 row-limitation 子句。指定这些子句时,需要使用 ORDER BY 子句来按照有意义的方式对行进行排序。
row-limitation-option-1 TOP 和 START AT 参数可以是主机变量的简单算术表达式、整型常量或整型变量。TOP 参数的计算结果必须是一个大于等于 0 的值。START AT 参数的计算结果必须是一个大于 0 的值。
如果未指定 startat-expression,则缺省值为 1。如果 TOP 的参数为 ALL,则从 startat-expression 开始的所有行都将被返回。TOP limit-expression START AT startat-expression
子句等同于 LIMIT ( startat-expression -1 ), limit-expression
或 LIMIT limit-expression OFFSET ( startat-expression -1 )
。
row-limitation-option-2 LIMIT 和 OFFSET 参数可以是主机变量的简单算术表达式、整型常量或整型变量。LIMIT 参数的计算结果必须是一个大于等于 0 的值。OFFSET 参数的计算结果必须是一个大于等于 0 的值。如果未指定 offset-expression,则缺省值为 0。
行限制子句 LIMIT offset-expression, limit-expression
等效于 LIMIT limit-expression OFFSET offset-expression
。这两个构造都等效于 TOP limit-expression START AT ( offset-expression + 1 )
。
缺省情况下,禁用 LIMIT 关键字。使用 reserved_keywords 选项可启用 LIMIT 关键字。
select-list 子句 select-list 是一个由逗号分隔的表达式列表,用于指定从数据库中检索的内容。星号 (*) 表示选择 FROM 子句中的所有表的所有列。
select-list 中允许使用集合函数。select-list 中还可以使用子查询。每个子查询都必须用括号括起来。
在整个查询中都可以使用别名来表示带别名的表达式。
Interactive SQL 还在 SELECT 语句的每个输出列的顶部显示别名。如果表达式后面未指定可选别名,则 Interactive SQL 显示该表达式。
INTO hostvar-list 子句 此子句仅用于嵌入式 SQL。它指定 SELECT 语句结果的位置。select-list 中的每一项都必须有一个主机变量项。select-list 中的项依次放入主机变量中。每个主机变量还可以有一个指示符主机变量,以便程序可以判定 select-list 项是否为 NULL。
如果查询结果中没有选定的行,则不更新变量并显示未找到行警告。
INTO variable-list 子句 此子句仅用于过程和触发器。它指定 SELECT 语句结果的位置。select-list 中的每一项都必须有一个变量。select-list 中的项依次放入变量中。
INTO table-name 子句 该子句用于创建表并用数据填充表。
对于所要创建的永久表,查询必须满足以下条件之一:
select-list 包含多个项,而 INTO 目标为单个 table-name 标识符。
select-list 包含一个 *,而 INTO 目标指定为 owner.table。
要创建一个列的永久表,表名必须指定为 owner.table。
作为创建表的副作用,此语句会在执行前导致 COMMIT。执行此语句需要具有 RESOURCE 权限。新表未被授予任何权限:该语句是后接 INSERT...SELECT 的 CREATE TABLE 的简写形式。
使用此子句创建的表没有定义主键。可以使用 ALTER TABLE 添加主键。在对表应用任何 UPDATE 或 DELETE 之前应添加主键;否则,这些操作会使受影响的行的所有列值记录在事务日志中。
INTO LOCAL TEMPORARY TABLE 此子句用于创建局部临时表,并用查询结果填充该表。使用此子句时,临时表名不必以 # 开头。
FROM 子句 行是从 table-expression 指定的表和视图中检索的。不带 FROM 子句的 SELECT 语句可用于显示不是从表中派生的表达式的值。例如,以下两个语句是等同的,都显示全局变量 @@version 的值。
SELECT @@version; SELECT @@version FROM DUMMY; |
WHERE 子句 此子句指定将从 FROM 子句指定的表中选择的行。该子句可用于在多个表之间建立连接,它是 ON 短语(FROM 子句的组成部分)的替代方法。
GROUP BY 子句 可以按列、别名或函数进行分组。查询结果对于指定列、别名或函数的每个不同的值集均包含一行。与 DISTINCT 和集合操作 UNION、INTERSECT 及 EXCEPT 一样,GROUP BY 子句处理 NULL 值的方式与处理每个域中任何其它值的方式相同。换句话说,分组属性内的多个 NULL 值将构成一个单个的组。然后可将集合函数应用于这些组以获得有意义的结果。
当使用 GROUP BY 时,select-list、HAVING 子句和 ORDER BY 子句不能引用 GROUP BY 子句中未指定的任何标识符。select-list 和 HAVING 子句例外,它们可以包含集合函数。
HAVING 子句 此子句根据组值而不是各行值来选择行。只有当该语句有 GROUP BY 子句或 select-list 完全由集合函数组成时,才能使用 HAVING 子句。在 HAVING 子句中引用的任何列名必须存在于 GROUP BY 子句中,或被用作 HAVING 子句中集合函数的参数。
ORDER BY 子句 此子句将对查询的结果进行排序。ORDER BY 列表中的每一项均可标记为 ASC 以按升序排序(缺省值),或标记为 DESC 以按降序排序。如果表达式是整数 n,则查询结果按 select-list 中的第 n 项排序。
确保以特定的顺序返回行的唯一方法是使用 ORDER BY。当缺少 ORDERBY 子句时,SQL Anywhere 以最有效的顺序返回行。这意味着结果集的外观可能因您上次访问行的时间和其它因素而异。
在嵌入式 SQL 中,SELECT 语句用于从数据库中检索结果,并通过 INTO 子句将值放入主机变量。SELECT 语句必须只返回一行。对于多行查询,必须使用游标。
FOR UPDATE 或 FOR READ ONLY 子句 这些子句指定是否允许通过在查询中打开的游标进行更新,以及当允许时,可使用哪种并发语义。此子句不能与 FOR XML 子句一起使用。
如果 SELECT 语句中未使用 FOR 子句,则游标的可更新性取决于游标的声明,并由 API 指定游标如何并发。在 ODBC、JDBC、OLE DB、ADO.NET 和嵌入式 SQL 中,语句的可更新性是显式的,除非被应用程序替换,否则将使用只读游标。在 Open Client 和存储过程中,无需指定游标的可更新性,缺省值为 FOR UPDATE。
对于 Open Client 和存储过程,游标的可更新性和语句的可更新性取决于 ansi_update_constraints 数据库选项的设置和语句的专有特性,包括语句是包含 ORDER BY、DISTINCT、GROUP BY、HAVING、UNION、集合函数、连接还是不可更新的视图。对于存储过程,或者在 ansi_update_constraints 选项设置为 Off 的情况下,游标的缺省设置为 FOR UPDATE(针对不带 ORDER BY 子句的单表查询)。如果 ansi_update_constraints 选项设置为 Cursors 或 Strict,则停留在包含 ORDER BY 子句的查询上的游标的缺省设置为 READ ONLY。但可使用 FOR UPDATE 子句将游标显式标记为可更新。由于允许通过 ORDER BY 子句或连接来更新游标的开销大,因此,停留在包含两个或更多表连接的查询上的游标为 READ ONLY,并且无法设置为可更新,除非 ansi_update_constraints 数据库选项为 Off。
声明为 FOR READ ONLY 的游标不能在 UPDATE(定位)、DELETE(定位)或 PUT 语句中使用。FOR READ ONLY 是嵌入式 SQL 的缺省设置。
FOR UPDATE 子句可显式地使游标能够更新。单独使用 FOR UPDATE 本身不影响对语句结果集中的行进行并发控制。为此,必须指定 FOR UPDATE BY LOCK 或 FOR UPDATE BY [ VALUES | TIMESTAMP ]。
为确保语句获得意图锁,必须执行以下步骤之一:
在查询中指定 FOR UPDATE BY LOCK
在查询的 FROM 子句中指定 HOLDLOCK、WITH ( HOLDLOCK )、WITH ( UPDLOCK ) 或 WITH ( XLOCK )
使用指定 CONCUR_LOCK 的 API 调用打开游标
读取带有指示读取更新的属性的行
FOR UPDATE OF 子句对可使用 UPDATE(定位)、DELETE(定位)或 PUT 语句修改的列进行显式命名。此子句不能与 FOR UPDATE、FOR READ ONLY 或 FOR XML 子句结合使用。
FOR XML 子句 此子句指定以 XML 文档格式返回结果集。XML 的格式取决于所指定的模式。此子句不能与 FOR UPDATE 或 FOR READ ONLY 子句一起使用。用 FOR XML 声明的游标为隐式只读。
当指定 RAW 模式时,结果集中的每一行表示为一个 XML <row> 元素,每一列表示为 <row> 元素的一个属性。
AUTO 模式返回嵌套 XML 元素格式的查询结果。select-list中引用的每一个表都会表示为 XML 中的一个元素。元素的嵌套顺序基于 select-list 中引用表的顺序。
使用 EXPLICIT 模式可以控制生成的 XML 文档的格式。在命名元素和指定嵌套结构方面,使用 EXPLICIT 模式比 RAW 或 AUTO 模式提供了更大的灵活性。
OPTION 子句 此子句提供关于如何处理查询的提示。支持以下查询提示:
MATERIALIZED VIEW OPTIMIZATION 子句 MATERIALIZED VIEW OPTIMIZATION 子句用于指定在处理查询时优化程序应如何利用实例化视图。指定的 option-value 将替换仅用于此查询的 materialized_view_optimization 数据库选项。option-value 可能的值同样可用于 materialized_view_optimization 数据库选项。
FORCE OPTIMIZATION 子句 当查询说明仅包含简单的查询(在 WHERE 子句中包含相等条件且唯一地标识特定行的单块、单表查询)时,它通常会在处理过程中跳过基于开销的优化。有时,您可能需要出现基于开销的优化。例如,如果在处理查询的过程中您想要考虑实例化视图,则视图匹配必须发生。但视图匹配只有在基于开销的优化过程中发生。如果想要针对某个查询发生基于开销的优化,而您的查询说明仅包括简单的查询,则可指定 FORCE OPTIMIZATION 选项以确保优化程序在查询上执行基于开销的优化。
同样,在过程中指定 SELECT 语句中的 FORCE OPTIMIZATION 选项会强制将优化程序用于对该过程的任何调用。这种情况下,不对该语句的计划进行高速缓存。
FORCE NO OPTIMIZATION 子句 如果希望语句跳过优化程序,可指定 FORCE NO OPTIMIZATION 子句。如果语句过于复杂以至于无法以这种方式进行处理(可能是由于数据库选项的设置,或由于模式或查询的特性而导致),此语句会失败并且数据库服务器将返回错误。
option-name = option-value 指定选项设置。您所指定的设置只适用于当前的语句,优先级高于任何公共或临时选项设置,包括支持 ODBC 的应用程序设定的设置。所支持的选项为:
如果在查询中指定 isolation_level 选项,则在查询中指定的值优先于当前查询的所有其它隔离级别设置(例如设置数据库的 isolation_level 选项或游标的设置)。
sequence-expression 可从序列生成器中选择当前值 (CURRVAL) 或下一个值 (NEXTVAL)。
SELECT 语句可用于:
从数据库中检索结果。
可在 Interactive SQL 中使用,以浏览数据库中的数据或将数据从数据库导出到外部文件。
可在过程和触发器中使用,或在嵌入式 SQL 中使用。带 INTO 子句的 SELECT 语句用于在 SELECT 语句只返回一行时从数据库中检索结果。对于多行查询,必须使用游标。
从一个过程返回结果集。
必须有指定表和视图的 SELECT 权限。
要从序列生成器中选择 CURRVAL 或 NEXTVAL 值,您必须具备 DBA 权限,即成为序列所有者或被授权使用序列生成器。
无。
SQL/2008 核心特性。SELECT 语句的复杂性意味着应该根据标准检查各子句。例如,可在 GROUP BY 子句中指定的 ROLLUP 关键字就是可选 SQL/2008 语言功能 T431 的一部分。SQL Anywhere 支持的一些 SQL/2008 可选语言功能包括:
WINDOW 子句和 WINDOW 集合函数是可选 SQL/2008 语言功能 T611 和 T612 的一部分。
序列表达式是功能 T176 的一部分。
公用表表达式是可选的 SQL/2008 语言功能 T121。包含在嵌套查询表达式中的公用表表达式是功能 T122。WITH RECURSIVE 是可选的 SQL/2008 语言功能 T131;如果包含在嵌套查询中,它构成功能 T132。
用包括 UNION、EXCEPT 或 INTERSECT 的查询表达式指定 ORDER BY 子句的功能是可选的功能 F850。在子查询中指定 ORDER BY 的功能是功能 F851。
在 SQL 标准中,FOR UPDATE 和 FOR READ ONLY 是游标声明的一部分。
SQL Anywhere 为 SELECT 语句的 SQL/2008 定义的多种扩充提供支持。这些扩充的一部分列举如下:
可选的 cursor-concurrency 子句 (FOR UPDATE BY { LOCK | VALUES | TIMESTAMP}) 为服务商扩充。
FOR XML、OPTION 和 INTO 子句为服务商扩充。
行限制子句为服务商扩充。在 SQL/2008 标准中,使用 FETCH FIRST 语法支持行限制,这是可选的语言功能 F856。SQL Anywhere 不支持功能 F856 的语法。
指定 ORDER BY n 的功能是服务商扩充。
在 SQL/2008 中,缺省情况下除 INSENSITIVE 游标之外的所有游标均可更新。嵌入式 SQL 程序的只读缺省值为服务商扩充。
Transact-SQL SQL Anywhere 和 Adaptive Server Enterprise 在 SELECT 语句支持上存在很大区别。有多个 SELECT 语句功能并不受 Adaptive Server Enterprise 的支持。
这些区别包括:
Sybase ASE 不支持 SQL Anywhere 的游标并发子句;要在读取行上获得一个锁,必须使用 HOLDLOCK 表提示。
Adaptive Server Enterprise 不支持递归查询或公用表表达式。
对于 Transact-SQL 外连接,Adaptive Server Enterprise 和 SQL Anywhere 存有差异。
在 Transact-SQL 中,使用 SELECT 语句为变量赋值,而不使用 Watcom SQL SET 语句。
此查询返回 Employees 表中的雇员总数。
SELECT COUNT(*) FROM Employees; |
此查询列出了所有客户及其订单总值。
SELECT CompanyName, CAST( SUM( SalesOrderItems.Quantity * Products.UnitPrice ) AS INTEGER ) VALUE FROM Customers JOIN SalesOrders JOIN SalesOrderItems JOIN Products GROUP BY CompanyName ORDER BY VALUE DESC; |
以下语句显示了一个嵌入式 SQL SELECT 语句,其中 Employees 表中的雇员数被选择到 :size 主机变量中:
SELECT COUNT(*) INTO :size FROM Employees; |
以下语句进行了优化,能够快速返回结果集中的第一行:
SELECT Name FROM Products GROUP BY Name HAVING COUNT( * ) > 1 AND MAX( UnitPrice ) > 10 OPTION( optimization_goal = 'first-row' ); |
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |