Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 参考 » 使用 SQL » SQL 语句 » SQL 语句 (P-Z)

 

SELECT 语句

此语句用于从数据库中检索信息。

语法
[ WITH temporary-views ]
  SELECT [ ALL | DISTINCT ] [ row-limitation ] 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 { UPDATE [ cursor-concurrency ] | READ ONLY } ]
[ FOR XML xml-mode ]
[ 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 :
  FIRST | TOP n [ START AT m ]
select-list :
expression [ [ AS ] alias-name ], ...
| *
| window-function OVER { window-name  | window-spec } 
   [ [ AS ] alias-name ]

from-expression:请参见FROM 子句

group-by-expression:请参见GROUP BY 子句

search-condition:请参见搜索条件

window-nameidentifier

window-expression:请参见WINDOW 子句

window-spec:请参见WINDOW 子句

window-function : 
RANK( )
| DENSE_RANK( )
| PERCENT_RANK( )
| CUME_DIST( )
| ROW_NUMBER( )
| aggregate-function
 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 (indicator allowed), string, identifier, or number
参数
  • WITH 或 WITH RECURSIVE 子句   定义一个或多个公用表表达式(也称为临时视图),用于该语句的其余部分。这些表达式可以是非递归的,也可以是自递归的。只要指定了 RECURSIVE 关键字,递归公用表表达式就可以单独显示,或与非递归表达式混杂显示。不支持相互递归公用表表达式。

    只有 SELECT 语句出现在下列位置之一时,才允许使用该子句:

    • 顶级 SELECT 语句中

    • VIEW 定义的顶级 SELECT 语句中

    • INSERT 语句内的顶级 SELECT 语句中

    递归表达式由一个初始子查询和一个递归子查询组成。初始查询隐式定义视图的模式。递归子查询必须在 FROM 子句中包含对视图的引用。每次迭代中,该引用只能引用以前迭代中添加到视图的行。该引用不能出现在外连接的空值提供方中。递归公用表表达式不得使用集合函数,而且不得包含 GROUP BY、ORDER BY 或 DISTINCT 子句。请参见公用表表达式

    不支持将 WITH 子句用于远程表。

  • ALL 或 DISTINCT 子句   All(缺省值)返回满足 SELECT 语句的子句的所有行。如果指定 DISTINCT,则会消除重复的输出行。当指定 DISTINCT 时,很多语句的执行时间显著延长,因此只有在必要时才应使用 DISTINCT。

  • row-limitation 子句   行限制子句允许您只返回满足 WHERE 子句的行的子集。TOP 和 START AT 值可以是主机变量、整型常量或整型变量。TOP 值必须大于等于 0。START AT 值必须大于 0。通常,在指定这些子句时也指定 ORDER BY 子句,这样可以用一种有意义的方式对这些行进行排序。请参见显式限制查询返回的行数

  • select-list 子句   select-list 是一个由逗号分隔的表达式列表,用于指定从数据库中检索的内容。星号 (*) 表示选择 FROM 子句中的所有表的所有列。

    select-list 中允许使用集合函数。select-list 中还可以使用子查询。每个子查询都必须用括号括起来。

    在整个查询中都可以使用别名来表示带别名的表达式。

    Interactive SQL 还在 SELECT 语句的每个输出列的顶部显示别名。如果表达式后面未指定可选别名,则 Interactive SQL 将显示表达式本身。

  • INTO 子句   下面是 INTO 子句的三种用法:

    • 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;

    请参见FROM 子句

  • WHERE 子句   此子句指定将从 FROM 子句指定的表中选择的行。该子句可用于在多个表之间建立连接,它是 ON 短语(FROM 子句的组成部分)的替代方法。请参见搜索条件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 子句中集合函数的参数。

  • WINDOW 子句   此子句定义全部或部分用于与窗口函数一起使用的窗口,例如 AVG 和 RANK。请参见WINDOW 子句

  • 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 子句一起使用。

    当指定 FOR UPDATE BY TIMESTAMP 或 FOR UPDATE BY VALUES 时,该数据库服务器通过使用由键集决定的游标来使用优化的并发。在这种情况下,可发生更新丢失。

    如果 SELECT 语句中未使用 FOR 子句,则游标的可更新性取决于游标的声明(请参见DECLARE 语句FOR 语句),并由 API 指定游标如何并发。在 ODBC、JDBC 和 OLE DB 中,语句的可更新性是显式和只读的,除非被应用程序替换,否则将使用只进游标。在 Open Client、嵌入式 SQL 和存储过程中,无需指定游标的可更新性,缺省值为 FOR UPDATE。

    为确保语句获得意图锁,必须执行以下步骤之一:

    • 在查询中指定 FOR UPDATE BY LOCK

    • 在查询的 FROM 子句中指定 HOLDLOCK、WITH ( HOLDLOCK )、WITH ( UPDLOCK ) 或 WITH ( XLOCK )

    • 使用指定 CONCUR_LOCK 的 API 调用打开游标

    • 读取带有指示读取更新的属性的行

    除了游标的可更新性之外,语句的可更新性还取决于 ansi_update_constraints 数据库选项的设置和语句的专有特性,包括语句是包含 ORDER BY、DISTINCT、GROUP BY、HAVING、UNION、集合函数、连接还是不可更新的视图。

    有关游标敏感性的详细信息,请参见SQL Anywhere 游标

    有关 ODBC 并发性的详细信息,请参见选择 ODBC 游标特性中对 SQLSetStmtAttr 的讨论。

    有关 ansi_update_constraints 数据库选项的详细信息,请参见ansi_update_constraints 选项 [兼容性]

    有关游标可更新性的详细信息,请参见了解可更新语句

  • FOR XML 子句   此子句指定以 XML 文档格式返回结果集。XML 的格式取决于所指定的模式。此子句不能与 FOR UPDATE 或 FOR READ ONLY 子句一起使用。

    当指定 RAW 模式时,结果集中的每一行表示为一个 XML <row> 元素,每一列表示为 <row> 元素的一个属性。

    AUTO 模式返回嵌套 XML 元素格式的查询结果。select-list中引用的每一个表都会表示为 XML 中的一个元素。元素的嵌套顺序基于 select-list 中引用表的顺序。

    使用 EXPLICIT 模式可以控制生成的 XML 文档的格式。在命名元素和指定嵌套结构方面,使用 EXPLICIT 模式比 RAW 或 AUTO 模式提供了更大的灵活性。请参见使用 FOR XML EXPLICIT

    有关使用 FOR XML 子句的详细信息,请参见使用 FOR XML 子句以 XML 格式检索查询结果

  • OPTION 子句   此子句提供关于如何处理查询的提示。支持以下查询提示:

    • MATERIALIZED VIEW OPTIMIZATION 子句   MATERIALIZED VIEW OPTIMIZATION 子句用于指定在处理查询时优化程序应如何利用实例化视图。指定的 option-value 将替换仅用于此查询的 materialized_view_optimization 数据库选项。option-value 可能的值同样可用于 materialized_view_optimization 数据库选项。请参见materialized_view_optimization 选项 [数据库]

    • FORCE OPTIMIZATION 子句   当查询说明仅包含简单的查询(在 WHERE 子句中包含相等条件且唯一地标识特定行的单块、单表查询)时,它通常会在处理过程中跳过基于开销的优化。在某些情况下,您可能需要出现基于开销的优化。例如,如果在处理查询的过程中您想要考虑实例化视图,则视图匹配必须发生。但视图匹配只有在基于开销的优化过程中发。如果想要针对某个查询发生基于开销的优化,而您的查询说明仅包括简单的查询,则可指定 FORCE OPTIMIZATION 选项以确保优化程序在查询上执行基于开销的优化。同样,在过程中指定 SELECT 语句中的 FORCE OPTIMIZATION 选项会强制将优化程序用于对该过程的任何调用。这种情况下,不对该语句的计划进行高速缓存。

      有关简单查询和视图匹配的详细信息,请参见查询处理阶段跳过查询处理阶段的资格

    • FORCE NO OPTIMIZATION 子句   如果希望语句跳过优化程序,可指定 FORCE NO OPTIMIZATION 子句。如果语句过于复杂以至于无法以这种方式进行处理(可能是由于数据库选项的设置,也可能是由于模式或查询的特性而导致),此语句会失败并且数据库服务器将返回错误。有关可跳过优化程序的语句的详细信息,请参见跳过查询处理阶段的资格

    • option-name = option-value   仅针对此语句指定优先于任何有效的公共或临时选项设置的选项设置。所支持的选项为:

注释

SELECT 语句可用于:

  • 从数据库中检索结果。

  • 可在 Interactive SQL 中使用,以浏览数据库中的数据或将数据从数据库导出到外部文件。

  • 可在过程和触发器中使用,或在嵌入式 SQL 中使用。带 INTO 子句的 SELECT 语句用于在 SELECT 语句只返回一行时从数据库中检索结果。对于多行查询,必须使用游标。

  • 从一个过程返回结果集。

注意

当 SELECT 语句中使用 GROUP BY 表达式时,select-list、HAVING 子句和 ORDER BY 子句只能引用 GROUP BY 子句中指定的标识符。select-list 和 HAVING 子句例外,它们可以包含集合函数。

权限

必须有指定表和视图的 SELECT 权限。

副作用

无。

另请参见
标准和兼容性
  • SQL/2003   核心特性。SELECT 语句的复杂性意味着应该根据标准检查各子句。例如,ROLLUP 关键字是特性 T431 的一部分。

    FOR UPDATE、FOR READ ONLY 和 FOR UPDATE ( column-list ) 都是核心特性。

    FOR UPDATE BY [ LOCK | TIMESTAMP | VALUES ] 是一个 SQL Anywhere 服务商扩充。

示例

此示例返回 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' );